VC++之网络编程三 TCP编程实例
转自:http://blog.csdn.net/thinkscape/article/details/4037476
注释参考:http://blog.163.com/163_dhbing/blog/static/117387803200942242433217/
Server:
#include <Winsock2.h> #include <stdio.h> #include <iostream> using namespace std; void main() { //mide delete word WORD wVersionRequested; //准备加载Winsock库的版本,注意高字节是副版本号 WSADATA wsaData; //是一个返回值,指向WSADATA结构的指针,WSAStartup函数将其加载的库版本信息输入到这个结构体中。 int err; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0){ return; } if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2)/*如果加载的版本不正确,返回。需要注意的是高字节是副版本号,低字节是主版本号*/ { WSACleanup(); return ; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); /*socket(int af,int type,int protocol); //socket 函数三个参数af,指定地址族,对于TCP/IP协议套接字,它只能是AF_INET;type参数指定Socket类型,对于1.1版本的Socket,它只支持两种类型的套接字,SOCK_STREAM指定产生流失套接字,SOCK_DGRAM产生数据报套接字;protocol是与特定的地址家族相关的协议,如果指定为0,那么系统就会根据地址格式和套接字类别,自动选择一个合适的协议。*/ SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv, (SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); /*s为指定要绑定的套接字;name指定了该套接字的本地地址信息,这是一个指向sockaddr结构的指针变量,该地址结构是为所有的地址家族准备的,这个结构可能随时用的网络协议不同而不同,所以才需要第三个参数namelen指定该地址结构的长度。*/ listen(sockSrv,5); /*// int listen(SOCKET s,int backlog); s是Socket不用说,backlog是等待队列的最大长度,比如现在设为2,那么假如同时有3个请求来到服务器端的时候,就把前两个放到请求队列中,第三个就会被拒绝。*/ SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);/*//建立连接,返回对应于此次连接的SOCKET*/ char sendBuf[100];//发送数据的buff sprintf(sendBuf,"welcome %s to my space",inet_ntoa(addrClient.sin_addr));//格式化客户端地址 send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送的字节多一个,最后一个是空,结束! char recvBuf[100];//接收数据的buff recv(sockConn,recvBuf,100,0);//接收数据 printf("%s/n",recvBuf); closesocket(sockConn);//关闭连接 } }
Client:
#include <Winsock2.h> #include <stdio.h> #include <iostream> using namespace std; void main(){ //mide delete word WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(2,2); err=WSAStartup(wVersionRequested,&wsaData); if(err!=0){ return; } if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wHighVersion)!=2) { WSACleanup(); return ; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; 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)); char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("%s/n",recvBuf); send(sockClient,"This is wangwu",strlen("This is wangwu")+1,0); closesocket(sockClient); WSACleanup(); }
注意:
server 和 client 都要"项目属性"--->"配置属性"----> "链接"----> "输入" --->"附加依赖项"中添加"ws2_32.lib"
(Leytton:若ws2_32.lib不行则加入WSOCK32.lib)