【问题标题】:multiple client UDP chat多客户端UDP聊天
【发布时间】:2012-09-07 22:37:44
【问题描述】:

我有以下代码...

客户代码

#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 聊天..我希望不止一个客户端向服务器发送消息..

【问题讨论】:

    标签: c linux sockets network-programming udp


    【解决方案1】:

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

    【讨论】:

    • 另一种可能性是线程化一个子进程来处理任何连接到服务器的新客户端,您在 pthread 库中也有许多函数来控制和同步您的线程。
    【解决方案2】:

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

    Concurrent server with select

    虽然上面的例子是用tcp写的,但可以剪裁成使用udp。

    其他选项可能包括在 Linux 2.6 上使用 poll、epoll 或与 fork 分离的线程。

    分叉创建一个单独的新进程。这在处理许多客户端时可能是不可行的,例如一个 Web 服务器处理数以万计的请求。现在它不能为每个客户端创建那么多线程或进程。另外,在收到请求时这样做是有开销的。

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

    C10k 描述了编写高性能服务器应用程序的许多可能策略,各有优缺点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2011-01-04
      • 1970-01-01
      相关资源
      最近更新 更多