socket编程——UDP协议(C语言编程)

xiaoxiao2025-08-23  105

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

 

转载请注明原文地址: https://www.6miu.com/read-5035164.html

最新回复(0)