最近在学网络编程,学习了UDP的通信原理。写了基于UDP的服务端和客户端,可以实现局域网直接的通信,可以实现一个服务端,对多个客户端,试验过两个客户端的,两个客户端可以接收到服务端的消息,两个客户端的消息服务端也可以收到,两个客户端之间无法通信。在接收方面,可能会出现接收混乱,因为是接收一句,发送一句。
下面是服务端的代码,是在控制台上实现的.
#include <iostream> #include <winsock2.h> using namespace std; #pragma comment(lib, "ws2_32.lib")//连接库 int main() {//创建套接字,相当于句柄 WORD Version; WSADATA wData; Version = MAKEWORD(2, 2); int n = WSAStartup(Version, &wData); if(n != 0)//检查是否出错,不过一般不会出错的 { cout << "Error!" << endl; return -1; } SOCKET soc = socket(AF_INET, SOCK_DGRAM, 0); if(INVALID_SOCKET == soc) { cout << "Error!" << endl; return -1; } //创建端口 sockaddr_in addSer; addSer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); addSer.sin_family = AF_INET; addSer.sin_port = htons(8008); //端口随便,端口号的有效范围是从0到65535。 n = bind(soc, (sockaddr*)&addSer, sizeof(addSer)); //一般来说,大于49151的端口号都代表动态端口。绑定套接字 if(n == SOCKET_ERROR) //出错检查,出错,可能端口被占用了,需要换一个 { cout << "Error!" << endl; return -1; } char Send[256]; //发送字符串 char Rev[256]; //接收字符串 sockaddr_in addClient; //接收方的地址信息结构体 int len = sizeof(sockaddr); while(1) { int i = recvfrom(soc, Rev, 256, 0, (sockaddr*)&addClient, &len); //接受,阻塞在这,直到接收到信息 Rev[i] = '\0'; if(Rev[0] == 'Q') { cout << "Char end!" << endl; break; } cout << inet_ntoa(addClient.sin_addr) << " say :" << Rev << endl; //输出发送方的IP,和信息 cout << "Please say something : "; gets(Send); sendto(soc, Send, strlen(Send), 0, (sockaddr *)&addClient, len); //发送消息 } closesocket(soc); //关闭套接字 WSACleanup(); return 0; }
#include <iostream> #include <winsock2.h> using namespace std; #pragma comment(lib, "ws2_32.lib") int main() {//创建套接字,跟服务端的差不多 WORD Version; WSADATA wData; Version = MAKEWORD(2, 2); int n = WSAStartup(Version, &wData); if(n != 0) { cout << "Error!" << endl; return -1; } SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0); if(INVALID_SOCKET == sockClient) { cout << "Error!" << endl; return -1; } sockaddr_in addser;//不同在这里,需要服务端的IP,端口 addser.sin_addr.S_un.S_addr = inet_addr("192.168.1.100"); addser.sin_family = AF_INET; addser.sin_port = htons(8008); char Send[256]; //发送的消息 char Rev[256]; //接收的消息 int len = sizeof(sockaddr); while(1) { cout << "Please say something : "; gets(Send); sendto(sockClient, Send, strlen(Send), 0, (sockaddr*)&addser, len); //发送 int i = recvfrom(sockClient, Rev, 256, 0, (sockaddr*)&addser, &len); //结束,阻塞在这 Rev[i] = '\0';//直到接收到 if(i == -1) cout << "服务端未开启!" << endl; else { if(Rev[0] == 'Q') { cout << "Char end!" << endl; break; } cout << inet_ntoa(addser.sin_addr) << " say : " << Rev << endl; //输出发送方的IP和消息 } } closesocket(sockClient); //关闭套接字 WSACleanup(); return 0; }
原文地址:http://blog.csdn.net/qq_25425023/article/details/45103045