【发布时间】:2014-05-14 11:52:53
【问题描述】:
在多个客户端请求上,给定的服务器代码应响应每个客户端请求的序列号。同样对于每个客户端请求,服务器应该分叉一个进程。然后子进程等待 5 秒并减少客户端请求计数。所以基本上它是一个令牌系统。
代码中的问题是,当我发送多个客户端请求时,除了第一个请求之外,其他请求会被阻止 5 秒,这是我不想要的。
static int num = 0;
int main(int ac, char *av[]){
struct sockaddr_in saddr;
struct hostent *hp;
char hostname[HOSTLEN];
int sock_id, sock_fd;
FILE *sock_fp;
int pid, fd[2];
pipe(fd);
sock_id = socket(PF_INET, SOCK_STREAM, 0);
if(sock_id == -1)
oops("Socket");
bzero((void *)&saddr, sizeof(saddr));
gethostname(hostname, HOSTLEN);
hp = gethostbyname(hostname);
bcopy((void *)hp->h_addr, (void *)&saddr.sin_addr, hp->h_length);
saddr.sin_port = htons(PORTNUM);
saddr.sin_family = AF_INET;
if(bind(sock_id, (struct sockaddr *)&saddr, sizeof(saddr)) != 0)
oops("bind");
if(listen(sock_id, 5) != 0)
oops("listen");
while(1) {
sock_fd = accept(sock_id, NULL, NULL);
printf("got a call\n");
if(sock_fd == -1)
oops("accept");
num++;
sock_fp = fdopen(sock_fd, "w");
if(sock_fp == NULL)
oops("fdopen");
fprintf(sock_fp, "Your token number is: %d\n", num);
fclose(sock_fp);
pid = fork();
if(pid == 0){
close(sock_id);
sleep(5);
num--;
close(fd[0]);
write(fd[1], &num, sizeof(num));
printf("Sent: %d\n", num);
close(fd[1]);
exit(0);
}
else if(pid > 0){
close(fd[1]);
read(fd[0], &num, sizeof(num));
printf("Received %d\n", num);
close(fd[0]);
close(sock_fd);
}
}
【问题讨论】:
-
您的代码似乎丢失了,例如一个
pipe电话。sock_id是什么?你知道当你关闭sock_fp时,你也关闭了sock_fd? -
为了清楚起见,我已经发布了整个代码。