服务端
创建套接字
因为是udp通信,所有要使用数据报套接字
int server_socket = socket(PF_INET, SOCK_DGRAM, 0);
if (server_socket == -1)
{
perror("socket()");
return -1;
}
设置服务端信息
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(atoi(argv[1]));
绑定套接字到上面指定地址
if (bind(server_socket, (sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
{
perror("bind()");
close(server_socket);
return -1;
}
接收数据recvform()
参数1:要读取的套接字,即服务端套接字
参数2:指向接收缓冲区的指针
参数3:缓冲区长度
参数4:标志,可以设置阻塞模式,写0即函数以默认方式执行
参数5:指向源地址的指针
参数6:源地址长度的指针
char msg[1024]{};
sockaddr_in clientAddr;
socklen_t len = sizeof(clientAddr);
while (true)
{
memset(msg, 0, sizeof(msg));
if(recvfrom(server_socket, msg, sizeof(msg), 0, (sockaddr *)&clientAddr, &len)==-1)
{
continue;
}
cout << "[" << inet_ntoa(clientAddr.sin_addr) << ":" << ntohs(clientAddr.sin_port)
<< "]:" << msg << endl;
if (strcmp(msg, "exit") == 0)
break;
}
关闭套接字
close(server_socket);
客户端
创建套接字
int client_socket = socket(PF_INET, SOCK_DGRAM, 0);
if (client_socket < 0)
{
perror("socket()");
return -1;
}
指定服务端的地址
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
serverAddr.sin_port = htons(atoi(argv[2]));
发送数据,sendto()
参数1:发送数据的套接字,即客户端套接字
参数2:发送数据的缓冲区的指针
参数3:数据长度
参数4:标志,可以设置阻塞模式,写0即函数以默认方式执行
参数5:指向目标地址的指针
参数6:目标地址的长度
char buf[1024]{};
while (true)
{
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), stdin);
buf[strcspn(buf, "\n")] = '\0';
if(sendto(client_socket, buf, sizeof(buf), 0, (sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
{
continue;
}
if (strcmp(buf, "exit") == 0)
break;
}
关闭套接字
close(client_socket);
运行效果如下: