c-多客户端UDP聊天



我有以下代码。。。

客户代码

#include<stdio.h>
#include<string.h>
//#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
main()
{   
        struct sockaddr_in client,server;
    int s,n;
        char b1[100],b2[100];
        s=socket(AF_INET,SOCK_DGRAM,0);
        server.sin_family=AF_INET;
        server.sin_port=2000;
        server.sin_addr.s_addr=inet_addr("127.0.0.1");
        printf("nClient ready....n");
        n=sizeof(server);
        while(1)
        {
            printf("nClient:");
            gets(b2);
            sendto(s,b2,sizeof(b2),0,(struct sockaddr *)&server,n);
            if(strcmp(b2,"end")==0)
                break;
            recvfrom(s,b1,sizeof(b1),0,NULL,NULL);
            printf("nServer:%s",b1);
        }
}

服务器代码。。。。。

#include<stdio.h>
#include<string.h>
//#include<sys/stat.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
main()
{
    struct sockaddr_in cliaddr,myaddr;
    int servsock,clisock;
    char b1[100],b2[100];
    servsock=socket(AF_INET,SOCK_DGRAM,0);
    myaddr.sin_family=AF_INET;
myaddr.sin_port=2000;
myaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
bind(servsock,(struct sockaddr *)&myaddr,sizeof(myaddr));
printf("nServer ready,waiting for client....n");
clisock=sizeof(cliaddr);
while(1)
{
    recvfrom(servsock,b1,sizeof(b1),0,(struct sockaddr *) &cliaddr,&clisock);
    if(!(strcmp(b1,"end")))
        break;
    printf("nCliaddr:%s",b1);
    printf("nmyaddr:");
    gets(b2);
    sendto(servsock,b2,sizeof(b2),0,(struct sockaddr *) &cliaddr,clisock);
}
}

这些代码用于单客户端UDP聊天。。。。我需要做什么更改才能使其成为多客户端UDP聊天。。。。我希望不止一个客户端向服务器发送消息。。

您需要使用fork()来创建并发服务器。希望这个链接能有所帮助。http://www.cems.uwe.ac.uk/~ngunton/workments/npws3.pdf

或者,您可以使用诸如select之类的api(它监视许多套接字描述符并返回数据可用的套接字描述符)来创建并发服务器。

具有选定的并发服务器

尽管上面的例子是用tcp编写的,但它可以定制为使用udp。

其他选项可能包括在Linux 2.6上使用轮询、epoll或与fork相距太远的线程

分叉创建了一个单独的新流程。当处理许多客户端时,这可能是不可行的,例如,一个web服务器处理数万个请求。现在,它无法为每个客户端创建那么多线程或进程。此外,在收到请求时这样做也有点过头了。

一个实用的解决方案是混合使用两者,即创建一组由工作进程或线程池监控的套接字描述符。只要其中任何一个空闲,这些描述符就会为工作提取描述符。

C10k描述了编写高性能服务器应用程序的许多可能策略,其中各有利弊。

最新更新