Linux 网络编程3 UDP通讯

Linux 网络编程:循环UDP

UDP循环服务器模型

UDP模型服务器端recvfrom() 函数进行接收,用户端sendto()进行发送。
在这里插入图片描述
Server端代码:

#include "net.h"

int main()
{
    int fp;
    struct sockaddr_in myaddr;
    // 1. open socket
    if((fp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket fail");
        exit(0);
    }

    // 2. set bind()
    memset(&myaddr, 0, sizeof(myaddr));
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(Netport);
    // inet_aton(Netip,(int_addr *)&myaddr.sin_addr.s_addr);
    //myaddr.sin_addr.s_addr = inet_addr(Netip);
    //优化,使服务器能够接受绑定在任意IP上 INADDR_ANY
    myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(fp,(struct sockaddr*) &myaddr,sizeof(myaddr)) < 0)
    {
        perror("bind fail");
        exit(0);
    }

 
    // 3. set recvfrom
    int ret = -1;
    struct sockaddr_in recv_addr;
    socklen_t recv_addr_len = sizeof(recv_addr);
    char ipv4_addr[16]={0};
    int connect_port = 0;
    char buf[BUFSIZ];
    bzero(buf,BUFSIZ);
    while(1)		//接收用户发送信息
    {
        ret = recvfrom(fp,buf,(BUFSIZ-1),0,(struct sockaddr*)&recv_addr, &recv_addr_len);
        if(ret < 0)
        {
            perror("recvfrom fail");
            exit(0);
        }
        if(NULL == inet_ntop(AF_INET,(void *)&recv_addr.sin_addr, ipv4_addr, sizeof(recv_addr)))
        {
            perror("inet_ntop");
            exit(0);
        }
        connect_port = ntohs(recv_addr.sin_port);
        if(!strncmp(buf,"\n",strlen("\n")))
        {
            bzero(buf,BUFSIZ);
        }
        if(!strncmp(buf,QUIT_STR,strlen(QUIT_STR)))
        {
            printf("(%s:%d) client is exiting! \n", ipv4_addr,connect_port);
            bzero(buf,BUFSIZ);
            continue;
            
        }   
        printf("(%s:%d) Receivedata: %s \n",ipv4_addr,connect_port,buf);
         //可在此添加服务器处理用户信息。

    }
    close(fp);

    return 0;

}

Client端代码:

#include "net.h"

int main()
{
    // 1. set 
    int fp = -1;
    if((fp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("socket fail");
        exit(0);
    }

    // 2.set sendto
    struct sockaddr_in myaddr;
    memset(&myaddr, 0, sizeof(myaddr));
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(Netport);
    //myaddr.sin_addr.s_addr = inet_addr(Netip);
    if(inet_pton(AF_INET, Netip, (void *)&myaddr.sin_addr.s_addr) != 1)
    {
        perror("inet_pton fail");
        exit(0);
    }
    char buf[BUFSIZ];
    
    while(1)		//向客户端发送信息
    {
        bzero(buf, BUFSIZ);
        if(NULL == fgets(buf,BUFSIZ,stdin))
        {
            continue;
        }
        sendto(fp,buf,strlen(buf),0,(struct sockaddr*)&myaddr,(socklen_t)sizeof(myaddr));
        if(!strncmp(buf,QUIT_STR,strlen(QUIT_STR)))
        {
            printf("Client is exiting !\n");
            break;
        }
        //可在此添加接收客户端返还信息。
    }
    close(fp);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值