【发布时间】:2015-03-22 09:31:15
【问题描述】:
我需要写一个可以处理多个连接的TCP服务器;我关注this guide并编写了以下程序:
static void _handle_requests(char* cmd,int sessionfd){
//TODO: extend
printf("RECEIVED: %s\n",cmd);
if (!strcmp(cmd,BAR)){
barrier_hit(&nodebar,sessionfd);
}else if (!strcmp(cmd, BYE)){
}else if (!strcmp(cmd, HI)){
}
}
void handle_requests(void){
listen(in_sock_fd,QUEUELEN);
fd_set read_set, active_set;
FD_ZERO(&active_set);
FD_SET(in_sock_fd, &active_set);
int numfd = 0;
char cmd[INBUFLEN];
for (;;){
read_set = active_set;
numfd = select(FD_SETSIZE,&read_set,NULL,NULL,NULL);
for (int i = 0;i < FD_SETSIZE; ++i){
if (FD_ISSET(i,&read_set)){
if (i == in_sock_fd){
//new connection
struct sockaddr_in cliaddr;
socklen_t socklen = sizeof cliaddr;
int newfd = accept(in_sock_fd,(struct sockaddr*)&cliaddr, &socklen);
FD_SET(newfd,&active_set);
}else{
//already active connection
read(i,cmd,INBUFLEN);
_handle_requests(cmd,i);
}
}
}
}
}
..和一个连接() 到服务器并对套接字文件描述符执行两次连续 write() 调用的单个客户端。
n = write(sm_sockfd, "hi", 3);
if (n < 0) {
perror("SM: ERROR writing to socket");
return 1;
}
//...later
n = write(sm_sockfd, "barrier", 8);
if (n < 0) {
perror("SM: 'barrier msg' failed");
exit(1);
}
问题是,服务器只接收第一条消息(“hi”);之后,选择呼叫挂起。由于客户端的写入(“屏障”)成功,该会话文件描述符不应该准备好读取吗?我犯了什么明显的错误吗?
谢谢;抱歉,如果这是显而易见的事情,我对 C 的网络库完全不熟悉,该项目很快就要到期了!
【问题讨论】:
标签: c sockets networking tcp