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; }