通过套接字从Java发送到C – 奇怪的结果
我有一个用Java编写的简单服务器,它只是将一个Integer发送到一个连接的客户端。 我有一个用C编写的客户端,它连接到服务器并打印出收到的Integer。
我的问题是结果各不相同。 大约一半时间执行客户端我得到正确的结果(234),但有时我得到8323072。
这是服务器:
class TCPServer { public static void main(String args[]) throws Exception { ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); System.out.println("welcomeSocket.accept() called"); DataInputStream inFromClient = new DataInputStream(connectionSocket.getInputStream()); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); outToClient.writeInt(234); } }
}
这是客户:
int main(int argc, char *argv[]) { if(argc != 4){ printUsage(); return; } char* serverIP = argv[1]; char* serverPortC = argv[2]; char* integerToSendC = argv[3]; int serverPort = atoi(serverPortC); int integerToSend = atoi(integerToSendC); int socketDesc = socket(AF_INET, SOCK_STREAM, 0); if(socketDesc < 0) { printf("Error when creating socket\n"); return; } struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(serverPort); inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); int connection = connect(socketDesc, (struct sockaddr*) &serverAddr, sizeof serverAddr); if(connection < 0) { printf("Error when establishing connection\n"); return; } char intBuffer[4]; if(recv(socketDesc, intBuffer, sizeof intBuffer, 0) == -1){ printf("Error while receiving Integer\n"); } int receivedInt = ntohl(*((int *) &intBuffer)); printf("Received int: %d\n", receivedInt); close(socketDesc); }
在此先感谢您的帮助!
编辑:所以最后我做了类似的事情,只针对遇到同样问题的人:
while(receivedBytes < 4){ int readBytes = read(receiverSocket, &intBuffer, (sizeof intBuffer) - receivedBytes, receivedBytes); receivedInteger += (intBuffer << (8*receivedBytes)); receivedBytes += readBytes; }
你能确定你在客户端收到了sizeof intBuffer
字节吗? 不,你不能,因为recv()
可能会返回更少的字节然后请求。
修改代码以循环recv()
,只要接收到更少的字节然后没有发生错误。
请注意, recv()
0
字节表示连接已被另一方关闭。
还要确保服务器端以网络字节顺序发送。
另外^ 2:最好初始化变量(这里是intBuffer
),至少在开发阶段,会说:在调优阶段之前。
您的问题可能是由于各种数据类型的子边界。
在Java中,4个字节分配给int
,2个字节分配给short
。
在C中,4个字节用于long
,2个字节用于int
。
这意味着Java int
– > C long
和Java short
– > C int
。
现在它取决于您的优先级所在。
如果你想在Java中执行一个强烈的数学计算并通过套接字将结果发送到C,我建议你做Java int -> C long
或者
如果您只想发送小数字并在C中完成强烈计算,请执行Java short
– > C int
转换。
希望有所帮助。