使用select实现一个基于UDP的一对一即时聊天程序。

注意事项

  • UDP通信时,client要先给server发送消息,这样server才能知道client的信息

代码

//server
#include <func.h>

#define BUFFSIZE 1024

int main()
{
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd == -1){
        perror("socket");
    }

    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8080);
    serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");

    int ret = bind(sfd,(const struct sockaddr*)&serverAddr,sizeof(serverAddr));
    if(ret == -1){
        perror("bind");
    }

    char buffer[BUFFSIZE];

    struct sockaddr_in clientAddr;
    fd_set rdset;
    int maxfd = STDIN_FILENO;
    while(1){
        FD_ZERO(&rdset);
        FD_SET(sfd,&rdset);
        FD_SET(STDIN_FILENO,&rdset);
        if(sfd > maxfd) maxfd = sfd;

        select(maxfd + 1,&rdset,NULL,NULL,NULL);
        
        if(FD_ISSET(sfd,&rdset)){
             memset(&clientAddr,0,sizeof(clientAddr));
             memset(&buffer,0,sizeof(buffer));
             socklen_t len = sizeof(clientAddr);
             ret =  recvfrom(sfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&clientAddr,&len);
             if(ret == 0) continue;
             printf("%s:%d say %s\n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port),buffer);
        }else if(FD_ISSET(STDIN_FILENO,&rdset)){
            memset(&buffer,0,sizeof(buffer));
            int num = read(STDIN_FILENO,&buffer,sizeof(buffer));
            if(num == 0) break;
            ret = sendto(sfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&clientAddr,sizeof(clientAddr));
        }
        
    }
    
    close(sfd);

    return 0;
}
//client
#include <func.h>

#define BUFFERSIZE 1024

int main()
{
    int cfd = socket(AF_INET,SOCK_DGRAM,0);
    if(cfd == -1){
        perror("socker");
    }

    struct sockaddr_in serverAddr;
    serverAddr.sin_addr.s_addr = inet_addr("192.168.44.128");
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(8080);
    
    char buffer[BUFFERSIZE] = "hello server\n";

    int ret = sendto(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
    
    if(ret == -1){
        perror("sendto");
    }

    fd_set rdset;

    int maxfd = STDIN_FILENO;
    while(1){
        FD_ZERO(&rdset);
        FD_SET(cfd,&rdset);
        FD_SET(STDIN_FILENO,&rdset);
        if(cfd > maxfd) maxfd = cfd;

        select(maxfd + 1,&rdset,NULL,NULL,NULL);

        if(FD_ISSET(STDIN_FILENO,&rdset)){
            memset(&buffer,0,sizeof(buffer));
            int num = read(STDIN_FILENO,&buffer,sizeof(buffer));
            if(num == 0) break;

           ret =  sendto(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,sizeof(serverAddr));
           if(ret == -1){
               perror("sendto");
            }
        }
        if(FD_ISSET(cfd,&rdset)){
            socklen_t len = sizeof(serverAddr);
            ret = recvfrom(cfd,&buffer,sizeof(buffer),0,(struct sockaddr*)&serverAddr,&len);
            if(ret == 0){
                break;
            }

            printf("server:%s\n",buffer);
        }
    }
    close(cfd);
    return 0;
}
posted @   Eaven_Wang  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示