TCPUDP简单通信案例

    xiaoxiao2022-07-13  163

    注意,因为使用了WinSock库中的函数,每个项目需要添加相应的.lib文件。可以按照如下添加ws2_32.lib库文件。

    项目->属性->配置属性->连接器->输入->附加依赖项 中添加ws2_32.lib库文件。

    1.TCP简单通信案例

    TcpSrv.cpp文件(服务端)

    #include <Winsock2.h> #include <stdio.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } //创建用于监听的套接字 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,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)); //将套接字设为监听模式,准备接收客户请求 listen(sockSrv,5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); printf("这里是服务端,客户端发来的数据:\n"); while(1) { //等待客户请求到来 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[100]; sprintf(sendBuf,"Welcome %s to Server!",inet_ntoa(addrClient.sin_addr)); //发送数据 send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; //接收数据 recv(sockConn,recvBuf,100,0); printf("%s\n",recvBuf); //关闭套接字 closesocket(sockConn); } }

    TcpClient.cpp文件(客户端)

    #include <Winsock2.h> #include <stdio.h> #include <windows.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return; } //创建套接字 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; //如果是在同一台电脑上操作就可以使用127.0.0.1;非同一台电脑上就要配置好IP地址 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); printf("这里是客户端,服务端发来的数据:\n"); while(1) { Sleep(1000); //向服务器发送连接请求 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //接收数据 char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); //发送数据 send(sockClient,"Hello,i am client.I have a request!",strlen("Hello,i am client.I have a request!")+1,0); //关闭套接字 closesocket(sockClient); WSACleanup(); } }

    实验结果截图:

    2.UCP简单通信案例

    UdpSrv.cpp文件(服务端)

    #include <Winsock2.h> #include <stdio.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { 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)); printf("这里是服务端,客户端发来的数据:\n"); while(1) { //等待并接收数据 SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); char recvBuf[100]; recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); printf("%s\n",recvBuf); } //关闭套接字 closesocket(sockSrv); WSACleanup(); }

    UdpClient.cpp文件(客户端)

    #include <Winsock2.h> #include <stdio.h> #include <windows.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { 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); printf("这里是客户端:\n"); while(1) { Sleep(1000); //发送数据 sendto(sockClient,"Hello,Server!",strlen("Hello,Server!")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); } //关闭套接字 closesocket(sockClient); WSACleanup(); }

    实验结果截图:

    3.基于UDP的简单聊天程序

    先启动服务端,后启动客户端并可以在控制台中输入字符串,按回车键;这时服务端就会收到客户端发来的消息,输出相应的IP地址,也可以在控制台中输入字符串可以返回给客户端,实现简单的聊天功能(输入 q 结束聊天)。当然了,没有多线程只能回合制发消息。

    NetSrv.cpp文件(服务端)

    #include <Winsock2.h> #include <stdio.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { 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); printf("这里是服务端:\n"); 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(); }

    NetClient.cpp文件(客户端)

    #include <Winsock2.h> #include <stdio.h> void main() { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return; } if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) { 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); printf("这里是客户端:\n"); 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(); }

    实验结果结果:

     

    最新回复(0)