【Linux】中UDP

xiaoxiao2021-02-28  114

udp协议是面向数据报的,无连接不可靠的传输层协议,因为udp无连接,因此实现udp socket不需要监听也不需要连接。在实现tcp socket时,其中的收发数据可以当做文件,通过read和write来读取(TCP是面向字节流的),而udp是面向数据报的协议,收发的单位都是数据报,需要采用专门的函数:

编写代码:

#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<string.h> void usage(const char*proc) { printf("Usage:%s,[udp_ip],[udp_port]\n",proc); } int main(int argc,char* argv[]) { if(argc != 3) { usage(argv[0]); return 1; } int sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { perror("socket"); return 2; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr=inet_addr(argv[1]); if(bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr))<0) { perror("bind"); return 3; } while(1) { struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); char buf[1024]; if(recvfrom(sock,buf,1024,0,(struct sockaddr*)&client_addr,&len)<0) { perror("recvfrom"); return 4; } printf("recv is %s\n",buf); char buff[1024]; printf("server :"); scanf("%s",buff); if(sendto(sock,buff,1024,0,(struct sockaddr*)&client_addr,sizeof(client_addr))<0) { perror("sendto"); return 5; } } close(sock); return 0; } udpclient.c

#include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<string.h> void usage(char* proc) { printf("Usage:%s,[udp_ip],[udp_port]\n",proc); } int main(int argc,char* argv[]) { if(argc!=3) { usage(argv[0]); return 1; } int sock = socket(AF_INET,SOCK_DGRAM,0); if(sock<0) { perror("socket"); return 2; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); while(1) { char buff[1024]; printf("client #"); scanf("%s",buff); if(sendto(sock,buff,1024,0,(struct sockaddr*)&server_addr,sizeof(server_addr))<0) { perror("sendto"); return 3; } char buf[1024]; socklen_t len = sizeof(server_addr); if(recvfrom(sock,buf,1024,0,(struct sockaddr*)&server_addr,&len)<0) { perror("recvfrom"); return 4; } printf("recv is %s\n",buf); } close(sock); return 0; }

如何实现可靠性:

UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。  传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。  实现确认机制、重传机制、窗口确认机制。  如果你不利用Linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:  发送:包的分片、包确认、包的重发  接收:包的调序、包的序号确认

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

最新回复(0)