您的位置:首页 > 其它

VC中写socket通讯的基本流程

2010-08-24 10:38 295 查看
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: }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: