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;
}