>시스템 튜토리얼 >리눅스 >Linux IPC udp/ip 소켓 프로그래밍: 네트워크 통신을 달성하는 효율적인 방법

Linux IPC udp/ip 소켓 프로그래밍: 네트워크 통신을 달성하는 효율적인 방법

王林
王林앞으로
2024-02-11 10:51:29416검색

Linux 시스템은 다중 작업의 동시 실행을 지원하는 운영 체제로, 동시에 여러 프로세스를 실행할 수 있어 시스템 활용도와 효율성이 향상됩니다. 그러나 이러한 프로세스 간에 데이터 교환 및 협업이 필요한 경우 신호, 메시지 큐, 공유 메모리, 세마포어 등과 같은 일부 프로세스 간 통신(IPC) 방법을 사용해야 합니다. 그중 udp/ip 소켓은 네트워크의 특정 세부 사항 및 프로토콜에 신경 쓰지 않고 둘 이상의 프로세스가 네트워크를 통해 데이터를 전송할 수 있도록 하는 비교적 효율적이고 유연한 IPC 방법입니다.

Linux IPC udp/ip socket 编程:一种实现网络通信的高效方式아아아아

소켓()

으아악

domain: 프로토콜 계열(네트워크 통신(IP) 또는 로컬 통신(xxx.socket))

  • AF_INET은 ipv4 네트워크 프로토콜
    type에 제공된 네트워크 프로토콜을 구현하는 데 사용됩니다: 프로토콜(TCP 또는 UDP)
  • SOCK_DGRAM //데이터그램 소켓, 구현에는 신뢰할 수 없는 연결 없는 데이터그램 통신 파티인 UDP 프로토콜이 포함되지만 이에 국한되지는 않습니다.
    protocol: 특수 프로토콜, 일반적으로 0

연락처 준비:

으아악

바인드()

으아악

sockfd: 소켓 파일의 fd(socket()에 의해 반환됨)
addr: Socketaddr_un 또는 soketaddr_in으로 캐스팅되어야 합니다. 위를 참조하세요.
addrlen: 통신 주소의 크기, sizeof()를 사용합니다.

sendto()

으아악

dest_addr: 대상 주소(수신자 정보)
addrlen: 대상 주소의 크기

ANote

  • 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 lxlinux.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제