1、收发信息
ssize_t sendto(int socket,void *message,size_t length,int flags,struct sockaddr *dest_addr,socklen_t dest_len);
返回值:length是多少,就返回多少
参数:dest_addr -->存放目标ip和端口号
ssize_t recvfrom(int socket, void *buffer,size_t length,int flags, struct sockaddr *address,socklen_t *address_len);
返回值:跟recv差不多,但是重要区别是:recv函数断开连接就不会阻塞,返回0,recvfrom函数一直阻塞
参数:address -->存放对方的ip和端口号2、udp的广播和组播
第一个:广播
思路:
发送端 接收端
socket() socket()
bind()//不可以使用具体的ip bind()//必须使用系统定义的宏INADDR_ANY
使用系统定义的宏INADDR_ANY
设置套接字的属性为可以广播 recvfrom()
sendto()//必须使用广播地址 close()
close()
第二个:组播
发送端 接收端
socket() socket()
bind()//不可以使用具体的ip bind()//必须使用系统定义的宏INADDR_ANY
使用系统定义的宏INADDR_ANY 将接收端添加到组播组
设置套接字的属性为可以广播 recvfrom()
sendto()//必须使用组播地址(D类地址) close()
代码实现:
发送端
int main()
{
int udpsock;
int ret;
char buf[20];
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof bindaddr);
bindaddr.sin_family=PF_INET;
bindaddr.sin_port=htons(10000);
bindaddr.sin_addr.s_addr=inet_addr("192.168.22.9");
//目标ip和端口号
struct sockaddr_in destaddr;
bzero(&destaddr,sizeof destaddr);
destaddr.sin_family=PF_INET;
destaddr.sin_port=htons(20000);
destaddr.sin_addr.s_addr=inet_addr("192.168.22.9");
//创建udp套接字
udpsock=socket(PF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字!\n");
return -1;
}
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定失败!\n");
return -1;
}
while(1)
{
bzero(buf,20);
printf("请输入要发送给对方的信息!\n");
scanf("%s",buf);
//发送信息给对方
ret=sendto(udpsock,buf,20,0,(struct sockaddr *)&destaddr,sizeof(destaddr));
printf("sendto 返回值是:%d\n",ret);
}
//挂机
close(udpsock);
return 0;
}
接收端:
/*
udp单向通信
*/
int main()
{
int udpsock;
int ret;
char buf[20]={0};
struct sockaddr_in bindaddr;
bzero(&bindaddr,sizeof bindaddr);
bindaddr.sin_family=PF_INET;
bindaddr.sin_port=htons(20000);
bindaddr.sin_addr.s_addr=inet_addr("192.168.22.9");
//目标ip和端口号
struct sockaddr_in srcaddr;
bzero(&srcaddr,sizeof srcaddr);
int addrsize=sizeof srcaddr;
//创建udp套接字
udpsock=socket(PF_INET,SOCK_DGRAM,0);
if(udpsock==-1)
{
perror("创建udp套接字!\n");
return -1;
}
//绑定
ret=bind(udpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
if(ret==-1)
{
perror("绑定失败!\n");
return -1;
}
while(1)
{
bzero(buf,20);
//接收信息
ret=recvfrom(udpsock,buf,8,0,(struct sockaddr *)&srcaddr,&addrsize);
printf("recvfrom 返回值是:%d 内容是:%s\n",ret,buf);
}
//挂机
close(udpsock);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)