ホームページ > 記事 > システムチュートリアル > Linux IPC udp/ip ソケット プログラミング: ネットワーク通信を実現する効率的な方法
Linux システムは、マルチタスクの同時実行をサポートするオペレーティング システムであり、複数のプロセスを同時に実行できるため、システムの使用率と効率が向上します。ただし、これらのプロセス間でデータ交換とコラボレーションが必要な場合は、シグナル、メッセージ キュー、共有メモリ、セマフォなどのプロセス間通信 (IPC) メソッドを使用する必要があります。その中でも、udp/ip ソケットは比較的効率的で柔軟な IPC 方式であり、ネットワークの特定の詳細やプロトコルを気にせずに、2 つ以上のプロセスがネットワークを介してデータを送信できるようになります。
rree ######ソケット()###### リーリーAF_INET
ipv4 ネットワーク プロトコルに指定されたネットワーク プロトコルを実装するために使用されます。: 通信アドレスのサイズ。sizeof(); を使用します。
######に送る()######
リーリー
dest_addr: 宛先アドレス(受信者情報)
addrlen: 宛先アドレスのサイズ
send(sockfd, buf, len, flags); sendto(sockfd, buf, len, flags, NULL, 0) と同等;
recv()/send()はsockfdによるデータの送受信を意味しますが、tcpでは送受信前にsockfdが対応するアドレスに接続されているため、送受信先・宛先を指定する必要はありませんが、udpでは送受信時に接続がないため指定が必要です。
リーリー
src_addrserver | 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编程还有很多其他的特性和用法,需要我们不断地学习和探索。
以上がLinux IPC udp/ip ソケット プログラミング: ネットワーク通信を実現する効率的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。