【发布时间】:2013-04-20 07:02:56
【问题描述】:
我有一个用 Java 编写的简单服务器,它只向连接的客户端发送一个整数。我有一个用 C 编写的客户端,它连接到服务器并打印出接收到的整数。
我的问题是结果各不相同。大约一半的时间执行客户端我得到正确的结果 (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;
}
【问题讨论】:
-
可能是因为在 Java 和 C 及其相关子边界中为
int分配了多少字节。尝试发送小数字。如果 Java 为 int 分配 4 个字节,C 分配 2 个字节。所以范围在 C 中要小得多 -
那个数字是 2**16 * 127(即第三个字节全为 1,底部两个全为 0)
-
@LittleChild 我也这么认为,但DataOutputStream.writeInt 似乎很清楚发送四个字节,至少在 32 位运行时。
-
你的演员阵容看起来很糟糕,更不用说非英特尔硬件上总线错误的主要位置了。您是否考虑过只是阅读
int32_t。 ? -
ntohl()之后返回的值为0x7F0000。 IE。 127 以第三个八位字节结束。我很想知道在ntohl()之前它是什么样子的
标签: java c sockets network-programming