济源最新招聘:为什么客户端只能建立一个连接

来源:百度文库 编辑:神马品牌网 时间:2024/05/04 08:41:50
这是一个供远程主机执行unix shell的C程序,代码如下,客户端只能有一个连接,当再建立一个连接时,服务器无反应,为什么:

# include <stdio.h>
# include <signal.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/time.h>
# include <netinet/in.h>
# include <netdb.h>
#define SERVPORT 7745
#define MAXDATASIZE 1024
#define BACKLOG 10
main()
{
int sockfd,client_fd,sin_size,msg_leng,n=512;
char buf[MAXDATASIZE];
char msg[1024];
char msg1[1024];
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
FILE *f;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket err!"); exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind出错!");
exit(1);
}
printf("Bind in %s\n",inet_ntoa(my_addr.sin_addr));
if (listen(sockfd, BACKLOG) == -1) {
perror("listen出错!");
exit(1);
}
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size)) == -1) {
perror("accept出错");
}
printf("From:%s\n",inet_ntoa(remote_addr.sin_addr));
strcpy(msg,"");
strcpy(msg1,"");
for(;;)
{
if ( (read(client_fd,buf,1)) < 0 ) { perror("revc出错!");break;}
else {
if (buf[0]=='\n')
{
if(msg[strlen(msg)]==0 && msg[strlen(msg)-1]==13) msg[strlen(msg)-1]=0;
printf("cmd:%s,len=%d\n",msg,strlen(msg));
if (!(f=popen(msg,"r") )) {printf("popen()!\n");close(f);}
while (fgets(buf,3,f) != NULL) write(client_fd,buf,3);
strcpy(msg,"");
}
else sprintf(msg,"%s%c",msg,buf[0]);
}
}
}

因为你的程序是单线程的,端口被占用后其他的访问就无法继续连接了,请求就会失败。

如果想让一个端口可以让多个客户端进行连接请求的话,那么必须使用多线程。

以上代码没看,估计是受限制

以上代码没看,估计是受限制