距离详解Linux下的UDP方式通讯
UDP方式点对点通讯
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<errno.h>
#include<stdlib.h>
#include<arpa/inet.h>
intmain(intargc,char**argv)
{
structsockaddr_ins_addr;
structsockaddr_inc_addr;
intsock;
socklen_taddr_len;
intlen;
charbuff[128];
/*创建socket,关键在于这个SOCK_DGRAM*/
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket");
exit(errno);
}else
printf("createsocket.\n\r");
memset(&s_addr,0,sizeof(structsockaddr_in));
/*设置地址和端口信息*/
s_addr.sin_family=AF_INET;
if(argv[2])
s_addr.sin_port=htons(atoi(argv[2]));
else
s_addr.sin_port=htons(7838);
if(argv[1])
s_addr.sin_addr.s_addr=inet_addr(argv[1]);
else
s_addr.sin_addr.s_addr=INADDR_ANY;
/*绑定地址和端口信息*/
if((bind(sock,(structsockaddr*)&s_addr,sizeof(s_addr)))==-1){
perror("bind");
exit(errno);
}else
printf("bindaddresstosocket.\n\r");
/*循环接收数据*/
addr_len=sizeof(c_addr);
while(1){
len=recvfrom(sock,buff,sizeof(buff)-1,0,
(structsockaddr*)&c_addr,&addr_len);
if(len<0){
perror("recvfrom");
exit(errno);
}
buff[len]='\0';
printf("收到来自%s:%d的消息:%s\n\r",
inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port),buff);
}
return0;
}
客户端源代码如下:
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<errno.h>
#include<stdlib.h>
#include<arpa/inet.h>
intmain(intargc,char**argv)
{
structsockaddr_ins_addr;
intsock;
intaddr_len;
intlen;
charbuff[128];
/*创建socket,关键在于这个SOCK_DGRAM*/
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket");
exit(errno);
}else
printf("createsocket.\n\r");
/*设置对方地址和端口信息*/
s_addr.sin_family=AF_INET;
if(argv[2])
s_addr.sin_port=htons(atoi(argv[2]));
else
s_addr.sin_port=htons(7838);
if(argv[1])
s_addr.sin_addr.s_addr=inet_addr(argv[1]);
else{
printf("消息必须有一个接收者!\n");
exit(0);
}
/*发送UDP消息*/
addr_len=sizeof(s_addr);
strcpy(buff,"helloi'mhere");
len=sendto(sock,buff,strlen(buff),0,
(structsockaddr*)&s_addr,addr_len);
if(len<0){
printf("\n\rsenderror.\n\r");
return3;
}
printf("sendsuccess.\n\r");
return0;
}
编译程序用下列命令:
gcc-Wallsimple-udpserver.c-oserver gcc-Wallsimple-udpclient.c-oclient
运行程序用下列命令:
./server127.0.0.17838 ./client127.0.0.17838
UDP方式广播通讯
源代码变成下面的:
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<errno.h>
#include<stdlib.h>
#include<arpa/inet.h>
intmain(intargc,char**argv)
{
structsockaddr_ins_addr;
intsock;
intaddr_len;
intlen;
charbuff[128];
intyes;
/*创建socket*/
if((sock=socket(AF_INET,SOCK_DGRAM,0))==-1){
perror("socket");
exit(errno);
}else
printf("createsocket.\n\r");
/*设置通讯方式对广播,即本程序发送的一个消息,网络上所有主机均可以收到*/
yes=1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&yes,sizeof(yes));
/*唯一变化就是这一点了*/
/*设置对方地址和端口信息*/
s_addr.sin_family=AF_INET;
if(argv[2])
s_addr.sin_port=htons(atoi(argv[2]));
else
s_addr.sin_port=htons(7838);
if(argv[1])
s_addr.sin_addr.s_addr=inet_addr(argv[1]);
else{
printf("消息必须有一个接收者!\n");
exit(0);
}
/*发送UDP消息*/
addr_len=sizeof(s_addr);
strcpy(buff,"helloi'mhere");
len=sendto(sock,buff,strlen(buff),0,
(structsockaddr*)&s_addr,addr_len);
if(len<0){
printf("\n\rsenderror.\n\r");
return3;
}
printf("sendsuccess.\n\r");
return0;
}
编译这个程序用下列命令:
gcc-Wallbroadc-udpclient.c-oclient
运行程序用下列命令:
./client192.168.0.2557838
就会往192.168.0网络内所有主机发消息。
其它主机如果运行了服务端:
./server自己的IP地址7838
则都会收到上述客户端发的消息了。