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