我用Java编写的一个简单的服务器,只是将一个整数连接的客户端。我有一个用C编写的客户端,它连接到服务器并打印出接收到的Integer。发送INT - 奇怪的结果
我的问题是结果不一样。大约有一半执行客户端我得到正确的结果(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 – 2013-04-20 07:04:47
中少得多,该数目是2 ** 16 * 127(即,第三个字节全1,底部的两个全0) – 2013-04-20 07:08:55
@LittleChild我本来也这么认为,但[DataOutputStream.writeInt](http://docs.oracle.com/javase/6/docs/api/java/io /DataOutputStream.html#writeInt(int))似乎很清楚发送四个字节,至少在32位运行时。 – WhozCraig 2013-04-20 07:09:37