C - read()从不在服务器端阻塞

时间:2012-11-07 20:04:33

标签: c sockets client

我正在为一个项目创建一个游戏,其中有一个高分服务器,游戏可以发送命令以保存新的高分,获得前10名等等。我遇到的问题是,在游戏向服务器发送一些命令后,它们被执行完全正常,即使游戏不是,read()呼叫也会继续接收null。发送任何东西!!

我一直在寻找解决方案,我检查了以下内容,他们没问题:

1-创建任何套接字时,我检查if (sockfd==-1)并打印错误并退出
2-我在每个插座上明确启用了阻止模式 3-我测试了所有插座

if(n < 0){  
   perror("Read Error:");
}  

它永远不会进入这里,但我改为

if(n == 0){  
   perror("Read Error:");
}  

我的地址不好!!有关如何让读取功能等到游戏实际执行发送的任何帮助?

以下是发送和读取代码失败:

服务器:

listen(sock, 5);
clientlength = sizeof(client_add); 
newsock = accept(sock, (struct sockaddr *) &client_add, &clientlength);
if(newsock < 0){
  printf("Couldn't accept\n");
}
while(1){
  bzero(buffer, 300);
  ioctl(newsock, FIONBIO, 0);  
  n= read(newsock, buffer, 299);
  if(n == 0){  
    perror("Read Error:");
  } 
  if(n<0){
    printf("Error while reading from socket\n");
  }
  printf("Received: %s\n",buffer);
  //send to function that processes the string 
  dothemagic(buffer);
}

已发送消息的示例:

strcpy(buffer, "gettop5");   
n = write(sock,buffer,strlen(buffer));
if (n < 0){ 
  printf("Writing to socket was unsuccessful\n");
}

1 个答案:

答案 0 :(得分:1)

最大的问题是你的printf / perror只打印一条消息,然后继续执行(使用清零的缓冲区......);你应该打印一个错误,然后从循环中退出/退出程序/任何合适的。 就像wildplasser指出的那样,n == 0不是错误。

如果你仍然无法解决问题,请尝试使用short, self contained, correct example - 只需将sscce放在一起就可以实现这个问题的频率令人印象深刻!