最近在学网络编程,学习了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;
}
测试的实例就不贴出来了,局域网的其他人说话不是很好!~~~