1

我有以下代码...

客户代码

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

4

2 回答 2

0

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

带有选择的并发服务器

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

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

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

一个实用的解决方案是混合使用这两种方法,即创建一组由工作进程或线程池监控的套接字描述符。一旦它们中的任何一个是免费的,它们就会立即获取工作描述符。

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

于 2012-09-15T11:55:34.547 回答
0

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

于 2012-09-14T18:30:46.190 回答