C语言socket编程怎么实现2个客户端之间通信
网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
【服务器端】#includestdafx.h#include#include#include#defineSERVER_PORT5208//侦听端口voidmain(){WORDwVersionRequested;WSADATAwsaData;intret,nLeft,length;SOCKETsListen,sServer;//侦听套接字,连接套接字structsockaddr_insaServer,saClient;//地址信息char*ptr;//用于遍历信息的指针//WinSock初始化wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本ret=WSAStartup(wVersionRequested,&wsaData);if(ret!=0){printf(WSAStartup()failed!\n);return;}//创建Socket,使用TCP协议sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sListen==INVALID_SOCKET){WSACleanup();printf(socket()faild!\n);return;}//构建本地地址信息saServer.sin_family=AF_INET;//地址家族saServer.sin_port=htons(SERVER_PORT);//注意转化为网络字节序saServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//使用INADDR_ANY指示任意地址//绑定ret=bind(sListen,(structsockaddr*)&saServer,sizeof(saServer));if(ret==SOCKET_ERROR){printf(bind()faild!code:%d\n,WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}//侦听连接请求ret=listen(sListen,5);if(ret==SOCKET_ERROR){printf(listen()faild!code:%d\n,WSAGetLastError());closesocket(sListen);//关闭套接字return;}printf(Waitingforclientconnecting!\n);printf(Tips:Ctrl+ctoquit!\n);//阻塞等待接受客户端连接while(1)//循环监听客户端,永远不停止,所以在本项目中,我们没有心跳包。{length=sizeof(saClient);sServer=accept(sListen,(structsockaddr*)&saClient,&length);if(sServer==INVALID_SOCKET){printf(accept()faild!code:%d\n,WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}charreceiveMessage[5000];nLeft=sizeof(receiveMessage);ptr=(char*)&receiveMessage;while(nLeft>0){//接收数据ret=recv(sServer,ptr,5000,0);if(ret==SOCKET_ERROR){printf(recv()failed!\n);return;}if(ret==0)//客户端已经关闭连接{printf(Clienthasclosedtheconnection\n);break;}nLeft-=ret;ptr+=ret;}printf(receivemessage:%s\n,receiveMessage);//打印我们接收到的消息。}//closesocket(sListen);//closesocket(sServer);//WSACleanup();}【客户端】#includestdafx.h#include#include#include#defineSERVER_PORT5208//侦听端口voidmain(){WORDwVersionRequested;WSADATAwsaData;intret;SOCKETsClient;//连接套接字structsockaddr_insaServer;//地址信息char*ptr;BOOLfSuccess=TRUE;//WinSock初始化wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本ret=WSAStartup(wVersionRequested,&wsaData);if(ret!=0){printf(WSAStartup()failed!\n);return;}//确认WinSockDLL支持版本2.2if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();printf(InvalidWinSockversion!\n);return;}//创建Socket,使用TCP协议sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient==INVALID_SOCKET){WSACleanup();printf(socket()failed!\n);return;}//构建服务器地址信息saServer.sin_family=AF_INET;//地址家族saServer.sin_port=htons(SERVER_PORT);//注意转化为网络节序saServer.sin_addr.S_un.S_addr=inet_addr(192.168.1.127);//连接服务器ret=connect(sClient,(structsockaddr*)&saServer,sizeof(saServer));if(ret==SOCKET_ERROR){printf(connect()failed!\n);closesocket(sClient);//关闭套接字WSACleanup();return;}charsendMessage[]=hellothisisclientmessage!;ret=send(sClient,(char*)&sendMessage,sizeof(sendMessage),0);if(ret==SOCKET_ERROR){printf(send()failed!\n);}elseprintf(clientinfohasbeensent!);closesocket(sClient);//关闭套接字WSACleanup();}
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇