- 论坛徽章:
- 0
|
找了一圈,觉得发在这个版块最合适。
我按照unix网络编程中的步骤以select实现了一个回射服务器,可是当只有一个连接的时候,正常工作,当第二个以上的连接连入时,客户端输入时,会阻塞在select函数,这时在第一个客户输入时,第二个客户的输入才会从服务器回射,不知道为什么,请高手指导。
下面是服务器和客户端的代码,运行时,注意修改IP.
serv.c
#define SERV_PORT 9877
#include "sys/select.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "string.h"
#include "stdio.h"
int main()
{
int skt = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in servaddr;
servaddr.sin_port = htons(SERV_PORT);
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"192.168.85.128",&servaddr.sin_addr);
bind(skt,(struct sockaddr*)&servaddr,sizeof(servaddr));
listen(skt,1024);
int client[FD_SETSIZE],i;
for(i=0;i<FD_SETSIZE;++i)
client = -1;
fd_set set,allset;
FD_ZERO(&allset);
FD_SET(skt,&allset);
int stdeof = 0;
int maxfd = skt ;
int maxi = -1;
for(;;)
{
set=allset;
int nready = select(maxfd+1,&set,NULL,NULL,NULL);
if(FD_ISSET(skt,&set))
{
int connfd = accept(skt,NULL,NULL);
printf("new connectio:%d\n",connfd);
for(i=0;i<FD_SETSIZE;++i)
if(client<0)
{
client = connfd;
break;
}
FD_SET(connfd,&allset);
if(connfd > maxfd )
maxfd = connfd;
if( i>maxi )
maxi = i;
if(--nready<=0)
continue;
}
for(i=0;i<=maxi;++i)
{
if(client<0)
continue;
if(FD_ISSET(client,&set))
{
int n;
char line[10240];
if((n=read(client,line,sizeof(line))) == 0)
{
close(client);
FD_CLR(client,&allset);
client = -1;
}
else
write(client,line,strlen(line));
}
if(--nready<=0)
break;
}
}
}
client.c
#include "sys/socket.h"
#include "netinet/in.h"
#include "stdio.h"
#include "string.h"
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("命令名+IP\n");
return 1;
}
int skt = socket(AF_INET,SOCK_STREAM,0);
if(skt == -1)
{
printf("socket error.\n");
return 1;
}
struct sockaddr_in servaddr;
servaddr.sin_port = htons(9877);
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
int ret=connect(skt,(struct sockaddr*)&servaddr,sizeof(servaddr));
if(ret == -1)
{
printf("connect error.\n");
return 1;
}
char line[1024],recv[1024];
while(scanf("%s",line)!=EOF)
{
write(skt,line,strlen(line));
int n= read(skt,recv,sizeof(recv));
recv[n] = 0;
printf("%s\n",recv);
}
} |
|