1

我正在为一个项目创建一个游戏,带有一个高分服务器,游戏可以在其中发送命令以保存新的高分,获得前 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");
}
4

1 回答 1

1

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

如果您仍然无法弄清楚,请尝试使用简短、独立、正确的示例——令人印象深刻的是,您只需将一个 sscce 放在一起就会意识到问题的频率!

于 2012-11-07T21:36:14.973 回答