我有以下代码......
客户代码
#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聊天....我希望有多个客户端将消息发送到服务器..
答案 0 :(得分:0)
您需要使用fork()来创建并发服务器。 希望此链接有所帮助。 http://www.cems.uwe.ac.uk/~ngunton/worksheets/npws3.pdf
答案 1 :(得分:0)
或者,您可以使用诸如select之类的api(它监视许多套接字描述符并返回可用数据的API)并创建并发服务器。
虽然上面的例子是用tcp编写的,但可以使用udp进行定制。
其他选项可能包括在Linux 2.6上使用poll,epoll或者与fork分开的线程。
forking创建一个单独的新进程。在处理许多客户端时这可能是不可行的,即说Web服务器处理成千上万的请求。现在它不能为每个客户端创建那么多线程或进程。此外,在接到请求时,这样做是有头脑的。
一个实际的解决方案是使用两者的混合,即创建一组由工作进程或线程池监视的套接字描述符。只要其中任何一个都是免费的,它们就会立即获取工作描述符。
C10k描述了编写高性能服务器应用程序的许多可能策略,每种策略都有利弊。