我正在为一个项目创建一个游戏,其中有一个高分服务器,游戏可以发送命令以保存新的高分,获得前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");
}
答案 0 :(得分:1)
最大的问题是你的printf / perror只打印一条消息,然后继续执行(使用清零的缓冲区......);你应该打印一个错误,然后从循环中退出/退出程序/任何合适的。 就像wildplasser指出的那样,n == 0不是错误。
如果你仍然无法解决问题,请尝试使用short, self contained, correct example - 只需将sscce放在一起就可以实现这个问题的频率令人印象深刻!