ソケット作成プロセス
6125 ワード
SOcketはLinuxまたはUnixの下で非常に流行しているネットワークプログラミング方式であり、この方式は簡単で効果的で、様々な複雑なプロトコル制御を柔軟に完成することができ、個人的な感覚はMFCの下のネットワーク関連クラスライブラリを使用するよりも快適である.すべてが自分で制御できるからだ.
しかし、socketプログラミングを使用すると非常に不便な点は、Linuxの下にVCのような強力なデバッグプラットフォームがないため、ネットワーク通信中のエラー追跡が少し複雑に見えることです.仕方なく、VCの下で標準的なsocket関数を使用してネットワーク通信を完了できるかどうかを試みるしかなく、VCの強力なデバッグツールを利用して効率的な符号化目的を達成することができます.
ネット上でいくつかの資料を探して、VCの下で標準socket関数を使うのも難しくないようで、すぐに過程を記録して、~~
最初のステップは、Linuxの下のsocketに関連するヘッダファイルの代わりにVCのwinsock.hヘッダファイルを使用します.
ステップ2では、VCのエンジニアリングリンクwinsockのライブラリファイルws 2_32.lib
上記の2つのステップは、次のコードで実現できます.
第3のステップでは、任意のsocket関数を使用する前に、まずWSAstartup関数を使用してwinsockを初期化し、アプリケーションを終了する前に、WSACleanup関数を使用してwinsockをクリーンアップします.次のコードを使用して実装できます.
OK、上の3ステップの処理を経て、プログラムの中で標準socket関数を使ってネットワーク通信を完成することができます!
最後に簡単な例を示します.
しかし、socketプログラミングを使用すると非常に不便な点は、Linuxの下にVCのような強力なデバッグプラットフォームがないため、ネットワーク通信中のエラー追跡が少し複雑に見えることです.仕方なく、VCの下で標準的なsocket関数を使用してネットワーク通信を完了できるかどうかを試みるしかなく、VCの強力なデバッグツールを利用して効率的な符号化目的を達成することができます.
ネット上でいくつかの資料を探して、VCの下で標準socket関数を使うのも難しくないようで、すぐに過程を記録して、~~
最初のステップは、Linuxの下のsocketに関連するヘッダファイルの代わりにVCのwinsock.hヘッダファイルを使用します.
ステップ2では、VCのエンジニアリングリンクwinsockのライブラリファイルws 2_32.lib
上記の2つのステップは、次のコードで実現できます.
#ifdef _WIN32
#include <winsock.h>
#pragma
comment(lib, "ws2_32.lib"
)
#else
#include <sys/socket.h>
#include <netinet/in
.h>
#include <arpa/in
.h>
#endif
第3のステップでは、任意のsocket関数を使用する前に、まずWSAstartup関数を使用してwinsockを初期化し、アプリケーションを終了する前に、WSACleanup関数を使用してwinsockをクリーンアップします.次のコードを使用して実装できます.
WORD wVersionRequested;
WSADATA wsaData;
int
err;
wVersionRequested = MAKEWORD( 1, 1 );
// init winsock before using socket functions
err = WSAStartup( wVersionRequested, &wsaData );
if
( err != 0 ) {
return
0;
}
// check winsock version
if
( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return
0;
}
// use socket function here
// clean up winsock before exit
WSACleanup();
OK、上の3ステップの処理を経て、プログラムの中で標準socket関数を使ってネットワーク通信を完成することができます!
最後に簡単な例を示します.
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <winsock.h>
#pragma
comment(lib, "ws2_32.lib"
)
#else
#include <sys/socket.h>
#include <netinet/in
.h>
#include <arpa/in
.h>
#endif
int
main(int
argc, char
*argv[])
{
int
err;
SOCKET sockClient;
SOCKADDR_IN addrSrv;
char
recvBuf[50];
#ifdef _WIN32
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if
( err != 0 ) {
return
0;
}
if
( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return
0;
}
#endif
sockClient=socket(AF_INET,SOCK_STREAM,0);
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"
);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof
(SOCKADDR));
send(sockClient,"hello"
,strlen("hello"
)+1,0);
recv(sockClient,recvBuf,50,0);
printf("%s/n"
,recvBuf);
#ifdef _WIN32
closesocket(sockClient);
WSACleanup();
#endif
return
0;
}