VC中写socket通讯的基本流程

来源:互联网 发布:抢商品软件 编辑:程序博客网 时间:2024/06/01 09:23

socket是一种在Linux或者Unix下非常流行的网络编程方式,这种方式简单有效,可以很灵活的完成各种复杂的协议控制,个人感觉比使用MFC下的网络相关类库要来的更舒服一些,因为所有一切都是自己可控的。

但是使用socket编程有一个非常不方便的地方在于,由于在Linux下没有一个像VC这样强大的调试平台,网络通信过程中的错误追踪就会显得稍微复杂一些。无奈,只能尝试在VC下是否可以使用标准的socket函数来完成网络通信,借助VC强大的调试工具来达到高效率的编码目的。

在网上找了一些资料,看来VC下使用标准socket函数也不是很困难,遂将过程记录,以便后用~~

第一步,使用VC的winsock.h头文件,代替Linux下的socket相关的头文件。

第二步,为VC的工程链接winsock的库文件ws2_32.lib

以上两步可以通过下面的代码实现:

   1: #ifdef _WIN32
   2: #include <winsock.h>
   3: #pragma comment(lib, "ws2_32.lib")
   4: #else
   5: #include <sys/socket.h>
   6: #include <netinet/in.h>
   7: #include <arpa/in.h>
   8: #endif

 

第三步,在使用任何socket函数之前,首先使用WSAStartup函数初始化winsock,在退出应用程序前,使用WSACleanup函数清理winsock。可以使用下面的代码实现:

   1: WORD wVersionRequested;
   2: WSADATA wsaData;
   3: int err;
   4: wVersionRequested = MAKEWORD( 1, 1 );
   5: // init winsock before using socket functions
   6: err = WSAStartup( wVersionRequested, &wsaData );
   7: if ( err != 0 ) {
   8:     return 0;
   9: }
  10: // check winsock version
  11: if ( LOBYTE( wsaData.wVersion ) != 1 ||
  12:     HIBYTE( wsaData.wVersion ) != 1 ) {
  13:     WSACleanup( );
  14:     return 0;
  15: }
  16:  
  17: // use socket function here
  18:  
  19: // clean up winsock before exit
  20: WSACleanup();

OK,经过上面的三步处理,就可以在程序中使用标准socket函数完成网络通信了!

最后给出一个简单的范例:

   1: #include <stdio.h>
   2: #include <stdlib.h>
   3:  
   4: #ifdef _WIN32
   5: #include <winsock.h>
   6: #pragma comment(lib, "ws2_32.lib")
   7: #else
   8: #include <sys/socket.h>
   9: #include <netinet/in.h>
  10: #include <arpa/in.h>
  11: #endif
  12:  
  13: int main(int argc, char *argv[])
  14: {
  15:     int err;
  16:     SOCKET sockClient;
  17:     SOCKADDR_IN addrSrv;
  18:     char recvBuf[50];
  19:  
  20: #ifdef _WIN32
  21:     WORD wVersionRequested;
  22:     WSADATA wsaData;
  23:     wVersionRequested = MAKEWORD( 1, 1 );
  24:  
  25:     err = WSAStartup( wVersionRequested, &wsaData );
  26:     if ( err != 0 ) {
  27:         return 0;
  28:     }
  29:  
  30:     if ( LOBYTE( wsaData.wVersion ) != 1 ||
  31:         HIBYTE( wsaData.wVersion ) != 1 ) {
  32:         WSACleanup( );
  33:         return 0;
  34:     }
  35: #endif
  36:  
  37:     sockClient=socket(AF_INET,SOCK_STREAM,0);
  38:  
  39:     addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
  40:     addrSrv.sin_family=AF_INET;
  41:     addrSrv.sin_port=htons(6000);
  42:     connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
  43:     send(sockClient,"hello",strlen("hello")+1,0);
  44:     recv(sockClient,recvBuf,50,0);
  45:     printf("%s/n",recvBuf);
  46:  
  47: #ifdef _WIN32
  48:     closesocket(sockClient);
  49:     WSACleanup();
  50: #endif
  51:     return 0;
  52: }