多客户端UDP聊天

时间:2012-09-14 18:27:48

标签: c linux sockets network-programming 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聊天....我希望有多个客户端将消息发送到服务器..

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

Concurrent server with select

虽然上面的例子是用tcp编写的,但可以使用udp进行定制。

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

forking创建一个单独的新进程。在处理许多客户端时这可能是不可行的,即说Web服务器处理成千上万的请求。现在它不能为每个客户端创建那么多线程或进程。此外,在接到请求时,这样做是有头脑的。

一个实际的解决方案是使用两者的混合,即创建一组由工作进程或线程池监视的套接字描述符。只要其中任何一个都是免费的,它们就会立即获取工作描述符。

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

相关问题