ソケット作成プロセス

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つのステップは、次のコードで実現できます.
 #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;
}