我用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