UDP协议--网络编程流程

  UDP是一种无连接的、不可靠的数据报服务。
服务器(被动)
int socket ();//第二个参数选用SOCK_DGRAM
int bind ();//作为服务器,必须将地址信息和sockfd进行绑定
int recvfrom (); //接收任意一个客户端的数据
int sendto (); //给一个客户端发送数据
int close();

客户端(主动)
int socket ();
int sendto ();
int recvfrom ();
int close();

所涉及到的系统调用用法

 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

其余系统调用与TCP协议网络编程流程(博客中有写过)中的一样。

例子
服务器端:

#include
#include
#include
#include
#include
#include
#include
#include

int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in ser_addr;
    memset(&ser_addr,0,sizeof(ser_addr));
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_port=htons(6000);
    ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

    int res=bind(sockfd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
    assert(res!=-1);

    while(1)
    {
        char buff[128]={0};
        struct sockaddr_in cli_addr;
        int len=sizeof(cli_addr);

        int n=recvfrom(sockfd,buff,127,0,(struct sockaddr*)&cli_addr,&len);
        if(n<=0)
        {
            printf("recvfrom error\n");
            continue;
        }

        printf("%s:%d-->%s\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.si    n_port),buff);

        int res=sendto(sockfd,"ok",2,0,(struct sockaddr*)&cli_addr,len);
        if(res<=0)
        {
            printf("sendto error\n");
            continue;
        }

    }
    close(sockfd);
    exit(0);
}

客户端:

#include
#include
#include
#include
#include
#include
#include
#include

int main()
{
    int sockfd=socket(AF_INET,SOCK_DGRAM,0);
    assert(sockfd!=-1);

    struct sockaddr_in ser_addr;
    memset(&ser_addr,0,sizeof(ser_addr));
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_port=htons(6000);
    ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

    while(1)
    {
        printf("input: ");
        char buff[128]={0};
        fgets(buff,127,stdin);
        if(strncmp(buff,"end",3)==0)
        {
            break;
        }

        int res=sendto(sockfd,buff,strlen(buff)-1,0,(struct sockaddr*)&ser_a    ddr,sizeof(ser_addr));
        assert(res!=-1);

        memset(buff,0,128);
        int n=recvfrom(sockfd,buff,127,0,NULL,NULL);
        assert(n!=-1);
        printf("recvfrom data :%s\n",buff);
    }
    close(sockfd);
    exit(0);
}

运行结果如下:
在这里插入图片描述
UDP协议--网络编程流程_第1张图片
特点
一次sendto对应一次recvfrom
接收方一次recvfrom如果没有将一次sendto发送的数据接收完,则剩余的数据就会被丢弃。
UDP协议--网络编程流程_第2张图片

你可能感兴趣的:(Linux)