基于Udp的Socket网络编程聊天程序
openkk
12年前
1.新建一个工程区Net
在工作区中添加两个工程 NetSrv 和 NetClient
为两个工程添加库文件 (Link中) ws2_32.lib
2.在工程NetSrv中添加Server.cpp文件
代码如下:
#include <WINSOCK2.H> #include <stdio.h> void main() { 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.wVersion ) != 2 ) { WSACleanup( ); return; } SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,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)); char recvBuf[100]; char sendBuf[100]; char tempBuf[200]; SOCKADDR_IN addrClient; int len = sizeof(SOCKADDR); while (1) { recvfrom(sockSrv , recvBuf, 100, 0, (SOCKADDR*)&addrClient,&len); if ('q'==recvBuf[0]) { sendto(sockSrv,"q",strlen("q")+1, 0 , (SOCKADDR*)&addrClient,len); printf("Chat end!\n"); break; } sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf); printf("%s\n",tempBuf); printf("Please input data:\n"); gets(sendBuf); sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); } closesocket(sockSrv); WSACleanup(); }3.在工程NetClient中添加Client.cpp文件 代码如下:
#include <WINSOCK2.H> #include <stdio.h> void main() { 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.wVersion ) != 2 ) { WSACleanup(); return; } SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,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); char recvBuf[100]; char sendBuf[100]; char tempBuf[200]; int len = sizeof(SOCKADDR); while (1) { printf("Please input data:\n"); gets(sendBuf); sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len); recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len); if ('q' == recvBuf[0]) { sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len); printf("Chat end!\n"); break; } sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf); printf("%s\n",tempBuf); } closesocket(sockClient); WSACleanup(); }
4.先运行服务端程序,再运行客户端程序
可以聊天了,但是只能客户端发一句,服务端发一句,比较呆板