注意事项
- UDP通信时,client要先给server发送消息,这样server才能知道client的信息
代码
//server
#include <func.h>
#define BUFFSIZE 1024
int main()
{
int sfd = socket(AF_INET,SOCK_DGRAM,0);
if(sfd == -1){
perror("socket");
}
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");
int ret = bind(sfd,(const struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret == -1){
perror("bind");
}
char buffer[BUFFSIZE];
struct sockaddr_in clientAddr;
fd_set rdset;
int maxfd = STDIN_FILENO;
while(1){
FD_ZERO(&rdset);
FD_SET(sfd,&rdset);
FD_SET(STDIN_FILENO,&rdset);
if(sfd > maxfd) maxfd = sfd;
select(maxfd + 1,&rdset,NULL,NULL,NULL);
if(FD_ISSET(sfd,&rdset)){
memset(&clientAddr,0,sizeof(clientAddr));
memset(&buffer,0,sizeof(buffer));
socklen_t len = sizeof(clientAddr);
ret = recvfrom(sfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&clientAddr,&len);
if(ret == 0) continue;
printf("%s:%d say %s\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port),buffer);
}else if(FD_ISSET(STDIN_FILENO,&rdset)){
memset(&buffer,0,sizeof(buffer));
int num = read(STDIN_FILENO,&buffer,sizeof(buffer));
if(num == 0) break;
ret = sendto(sfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&clientAddr,sizeof(clientAddr));
}
}
close(sfd);
return 0;
}
//client
#include <func.h>
#define BUFFERSIZE 1024
int main()
{
int cfd = socket(AF_INET,SOCK_DGRAM,0);
if(cfd == -1){
perror("socker");
}
struct sockaddr_in serverAddr;
serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8080);
char buffer[BUFFERSIZE] = "hello server\n";
int ret = sendto(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret == -1){
perror("sendto");
}
fd_set rdset;
int maxfd = STDIN_FILENO;
while(1){
FD_ZERO(&rdset);
FD_SET(cfd,&rdset);
FD_SET(STDIN_FILENO,&rdset);
if(cfd > maxfd) maxfd = cfd;
select(maxfd + 1,&rdset,NULL,NULL,NULL);
if(FD_ISSET(STDIN_FILENO,&rdset)){
memset(&buffer,0,sizeof(buffer));
int num = read(STDIN_FILENO,&buffer,sizeof(buffer));
if(num == 0) break;
ret = sendto(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret == -1){
perror("sendto");
}
}
if(FD_ISSET(cfd,&rdset)){
socklen_t len = sizeof(serverAddr);
ret = recvfrom(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,&len);
if(ret == 0){
break;
}
printf("server:%s\n",buffer);
}
}
close(cfd);
return 0;
}
标签:UDP,一对一,ret,rdset,buffer,int,serverAddr,sizeof,select
From: https://www.cnblogs.com/EavenWang/p/18226183