ホームページ  >  記事  >  システムチュートリアル  >  Linux IPC udp/ip ソケット プログラミング: ネットワーク通信を実現する効率的な方法

Linux IPC udp/ip ソケット プログラミング: ネットワーク通信を実現する効率的な方法

王林
王林転載
2024-02-11 10:51:29336ブラウズ

Linux システムは、マルチタスクの同時実行をサポートするオペレーティング システムであり、複数のプロセスを同時に実行できるため、システムの使用率と効率が向上します。ただし、これらのプロセス間でデータ交換とコラボレーションが必要な場合は、シグナル、メッセージ キュー、共有メモリ、セマフォなどのプロセス間通信 (IPC) メソッドを使用する必要があります。その中でも、udp/ip ソケットは比較的効率的で柔軟な IPC 方式であり、ネットワークの特定の詳細やプロトコルを気にせずに、2 つ以上のプロセスがネットワークを介してデータを送信できるようになります。

Linux IPC udp/ip socket 编程:一种实现网络通信的高效方式rree ######ソケット()###### リーリー

domain: プロトコル ファミリ (ネットワーク通信 (IP) またはローカル通信 (xxx.socket))

AF_INET

ipv4 ネットワーク プロトコルに指定されたネットワーク プロトコルを実装するために使用されます。
  • type: プロトコル (TCP または UDP)
    SOCK_DGRAM //データグラム ソケット、実装には UDP プロトコルが含まれますが、これに限定されません。UDP プロトコルは信頼性が低く、コネクションレス型のデータグラム通信パーティです。
  • protocol: 特別なプロトコル、一般的な Give 0
    連絡先アドレスを準備してください:
リーリー ######練る()###### リーリー

sockfd: ソケット ファイルの fd (socket() によって返される)

addr:socketaddr_un または soketaddr_in にキャストする必要があります。上記を参照

addrlen

: 通信アドレスのサイズ。sizeof(); を使用します。 ######に送る()###### リーリー
dest_addr: 宛先アドレス(受信者情報)
addrlen: 宛先アドレスのサイズ

A注

send(sockfd, buf, len, flags); sendto(sockfd, buf, len, flags, NULL, 0) と同等;
recv()/send()はsockfdによるデータの送受信を意味しますが、tcpでは送受信前にsockfdが対応するアドレスに接続されているため、送受信先・宛先を指定する必要はありませんが、udpでは送受信時に接続がないため指定が必要です。

recvfrom()

リーリー

src_addr
    : データ送信者の通信アドレスを保存するために使用される構造体ポインタ
  • addrlen
  • : 送信者のアドレス サイズを保存するために使用されるポインタ型
  • ###注記:###
    • recv(sockfd, buf, len, flags); 等价于 recvfrom(sockfd, buf, len, flags, NULL, 0);
    • accept() and recvfrom() 后面的参数是用来提供来电显示的
    • 一个server对应多个client
    • server可以不知道client的地址, 但是client得知道server的地址
    • send data 一定要知道对方地址
    • receive data不需要知道对方地址
    • TCP/IP的socket都是SOCK_STREAM的,全程连接,通过socket就能找到对方地址, send data的话,直接丢给socket就行
    • UDP/IP的socket是SOCK_DGRAM的,不全程连接,不能通过socket找到对方,send data的话,server中需要使用recvfrom()来知道client的地址, 所以肯定要sendto();client本来就知道server的地址, 直接sendto()
    • recvfrom()的唯一意义就是在udp-server中配合sendto()使用
    • 因为不能通过socket找到对方, 只要是udp发消息, 就得通过sendto()
    server client
    TCP/IP send();recv() send();recv()
    UDP/IP recvfrom();sendto() recv();sendto()

    例子-一对一的upd/ip协议的服务器模型

    //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 サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。