在VC下使用标准的socket函数编程的步骤

来源:互联网 发布:java建站系统 编辑:程序博客网 时间:2024/06/06 12:45

VC下使用标准的socket函数编程的步骤
    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
第三步,在使用任何sochet函数之前,首先使用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: }
http://hi.baidu.com/hiroada/blog/item/9ece37d6083a32d5a044df7e.html

原创粉丝点击