Heim > Artikel > System-Tutorial > Linux IPC UDP/IP-Socket-Programmierung: eine effiziente Möglichkeit, Netzwerkkommunikation zu erreichen
Linux-System ist ein Betriebssystem, das die gleichzeitige Ausführung mehrerer Aufgaben unterstützt. Es kann mehrere Prozesse gleichzeitig ausführen und dadurch die Systemauslastung und -effizienz verbessern. Wenn jedoch Datenaustausch und Zusammenarbeit zwischen diesen Prozessen erforderlich sind, müssen einige IPC-Methoden (Inter-Process Communication) verwendet werden, z. B. Signale, Nachrichtenwarteschlangen, gemeinsam genutzter Speicher, Semaphore usw. Unter diesen ist UDP/IP-Socket eine relativ effiziente und flexible IPC-Methode, die es zwei oder mehr Prozessen ermöglicht, Daten über das Netzwerk zu übertragen, ohne sich um die spezifischen Details und Protokolle des Netzwerks zu kümmern.
#include #include #include #include #include //服务器: socket() //创建socket struct sockaddr_in //准备通信地址 bind() //绑定socket和addr sendto()/recvfrom //进行通信 close() //关闭socket //客户端: socket() //创建socket: //准备通信地址:服务器的地址 sendto()/recv() //进行通信: close() //关闭socket:
//创建网络端点,返回socket文件描述符,失败返回-1设errno int socket(int domain, int type, int protocol);
Domäne: Protokollfamilie (Netzwerkkommunikation (IP) oder lokale Kommunikation (xxx.socket))
struct sockaddr{ //主要用于函数的形参类型, 很少定义结构体变量使用, 叫做通用的通信地址类型//$man bind sa_family_t sa_family; char sa_data[14]; } struct sockaddr_in{ //准备网络通信的通信地址 //$man in.h sa_family_t sin_family; //协议族, 就是socket()的domain的AF_INET in_port_t sin_port; //端口号 struct in_addr sin_addr; //IP地址, //当前网段的最大ip地址是广播地址,即,xxx.xxx.xxx.255。 //255.255.255.255在所有网段都是广播地址 } struct in_addr{ in_addr_t s_addr; //整数类型的IP地址 }
//把通信地址和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errno int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd: fd der Socket-Datei (zurückgegeben von socket())
addr: muss in socketaddr_un oder soketaddr_in umgewandelt werden, siehe oben
addrlen: die Größe der Kommunikationsadresse, verwenden Sie sizeof();
//向指定的socket和相应的地址发送消息,成功返回实际发送数据的大小,失败返回-1设errno ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
dest_addr: Zieladresse (Empfängerinformationen)
addrlen: Größe der Zieladresse
AHinweis
//从指定的socket和相应的地址接受消息,并提供来电显示的功能,成功返回实际接收的数据大小, 失败返回-1设errno ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
src_addr: Strukturzeiger, der zum Speichern der Kommunikationsadresse des Datensenders verwendet wird.
addrlen: Zeigertyp, der zum Speichern der Adressgröße des Absenders verwendet wird
server | client | |
---|---|---|
TCP/IP | send();recv() | send();recv() |
UDP/IP | recvfrom();sendto() | recv();sendto() |
//udp/ip server 五步走 #include #include #include #include #include #include #include int main(){ //1. 创建socket int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(-1==sockfd) perror("socket"),exit(-1); //2. 准备通信地址 struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(8888); addr.sin_addr.s_addr=inet_addr("176.43.11.211"); //3. 绑定socket和通信地址 int res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); if(-1==res) perror("bind"),exit(-1); printf("bind success\n"); //4. 进行通信 char buf[100]={0}; struct sockaddr_in recv_addr; //为使用recvfrom得到client地址做准备, 最终为sendto()做准备 socklen_t len=sizeof(recv_addr); res=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&recv_addr,&len); if(-1==res) perror("recvfrom"),exit(-1); char* ip=inet_ntoa(recv_addr.sin_addr); //将recvfrom获得client地址转换成点分十进制字符串 printf("data received from client :%s is:%d\n",ip,res); res=sendto(sockfd,"I received",sizeof("I received"),0,(struct sockaddr*)&recv_addr,len) ;//使用recvfrom获得的client地址 if(-1==res) perror("sendto"),exit(-1); //5. 关闭socket res=close(sockfd); if(-1==res) perror("close"),exit(-1); printf("close success\n"); return 0; } //udp/ip client #include #include #include //close() #include #include #include #include int main(){ int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(-1==sockfd) perror("socket"),exit(-1); printf("create socket succesfully\n"); struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(8888); addr.sin_addr.s_addr=inet_addr("176.43.11.211"); //这个是server的地址, 虽然没有 connect, which means 不能通过socket找到这个地址, 但是我们还是知道这个地址的, sendto()是可以直接用的 int res=sendto(sockfd,"hello",sizeof("hello"),0,(struct sockaddr*)&addr,sizeof(addr)); if(-1==res) perror("sendto"),exit(-1); printf("data sent size:%d\n",res); char buf[100]={0}; res=recv(sockfd,buf,sizeof(buf),0); if(-1==res) perror("recv"),exit(-1); printf("data received from server:%s\n",buf); res=close(sockfd); if(-1==res) perror("close"),exit(-1); return 0; }
本文介绍了Linux系统中udp/ip socket编程的方法,包括socket的创建、绑定、发送、接收、关闭和设置等方面。通过了解和掌握这些知识,我们可以更好地使用udp/ip socket来实现进程间通信,提高系统的性能和可靠性。当然,Linux系统中udp/ip socket编程还有很多其他的特性和用法,需要我们不断地学习和探索。
Das obige ist der detaillierte Inhalt vonLinux IPC UDP/IP-Socket-Programmierung: eine effiziente Möglichkeit, Netzwerkkommunikation zu erreichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!