socket编写流程

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

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

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

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

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

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

 #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

第三步,在使用任何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,经过上面的三步处理,就可以在程序中使用标准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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值