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

在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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值