2013-05-03 153 views
0

我用這個代碼從我的Java客戶端發送到我的Java服務器從C客戶端發送一個整數到Java服務器

int n = rand.nextInt(50) + 1; 
      DataOutputStream dos = new DataOutputStream(_socket.getOutputStream()); 
      dos.writeInt(n); 

整數,然後在服務器中使用此代碼閱讀

DataInputStream din = new DataInputStream(socket.getInputStream()); 
     int ClientNumber= din.readInt(); 
     System.out.println(ClientNumber); 


     ClientNumber++; 
     DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 
     dos.writeInt(ClientNumber); 

     String randomString= getRandomValue(10,20); 
     dos.writeUTF(randomString); 

它完美地工作,但現在我想編寫C客戶端 我想這個代碼

#include <stdio.h> 
#include <errno.h> 
#include <signal.h> 

#include <netdb.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 

#define SERVEURNAME "localhost" // adresse IP de mon serveur 

int to_server_socket = -1; 

void main (void) 
{ 

    char *server_name = SERVEURNAME; 
    struct sockaddr_in serverSockAddr; 
    struct hostent *serverHostEnt; 
    long hostAddr; 
    long status; 
    char buffer[512]; 

    bzero(&serverSockAddr,sizeof(serverSockAddr)); 
    hostAddr = inet_addr(SERVEURNAME); 
    if ((long)hostAddr != (long)-1) 
     bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr)); 
    else 
    { 
     serverHostEnt = gethostbyname(SERVEURNAME); 
     if (serverHostEnt == NULL) 
     { 
      printf("gethost rate\n"); 
      exit(0); 
     } 
     bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length); 
    } 
    serverSockAddr.sin_port = htons(8071); 
    serverSockAddr.sin_family = AF_INET; 

    /* creation de la socket */ 
    if ((to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) 
    { 
     printf("creation socket client ratee\n"); 
     exit(0); 
    } 
    /* requete de connexion */ 
    if(connect(to_server_socket, 
       (struct sockaddr *)&serverSockAddr, 
       sizeof(serverSockAddr)) < 0) 
    { 
     printf("demande de connection ratee\n"); 
     exit(0); 
    } 
    /* envoie de donne et reception */ 
    int value = htons(4); 
    write(to_server_socket, &value, sizeof(value)); 

    printf(buffer); 


} 

,但它不工作。我使用Eclipse進行編譯java代碼並運行的C代碼(客戶端),服務器和Xcode的,但我不認爲這個問題是存在的

編輯: 我在服務器上得到一個錯誤

java.net.SocketException異常:在 java.net.SocketOutputStream.socketWrite0(本機方法)在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)中斷的管道 在java.net.SocketOutputStream.write (SocketOutputStream.java:115)at java.io.DataOutputStream.writeInt(DataOutputStream.java:182)at ServiceRequest.run( ServiceRequest.java:36)在 java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:439) 在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:303)

我認爲這是因爲我的服務器等待一個整數,但它不是...?

+0

獲取'write'返回的值。如果'-1',然後檢查'errno'。 – austin 2013-05-03 15:24:16

+1

定義「不工作」 – 2013-05-03 15:25:27

回答

2

兩件事情,在此聲明我跳出...

write(to_server_socket,"4",4); 

1)「4」是不是整數,這是一個空結尾的字符串(好吧,好吧,它是一個整數,但它不是你「的意思是」做我認爲)

2)您發送可能會或可能不會是相同的網絡字節序的主機字節順序值

int value = htons(4); 
write(to_server_socket, &value, sizeof(value)); 

除此之外,然而,「破管」錯誤f從java socketWrite() rom往往會表明你的發送端(C應用程序)已關閉套接字,你的java端仍然試圖寫入它。

你的C客戶端代碼打開套接字,寫入它,然後立即打印一個你從未填充任何東西並退出程序的緩衝區。一旦程序退出,您爲它創建的套接字就會關閉,因此Java服務器中的「斷開的管道」錯誤。你需要從服務器讀取回復...

int value = htonl(4); 
int reply = 0; 

if(send(to_server_socket, &value, sizeof(value), 0) != sizeof(value)) 
{ 
    printf("socket write failed: %s", strerror(errno)); 
    exit(-1); 
} 

if(recv(to_server_socket, &reply, sizeof(reply), MSG_WAITALL) != sizeof(reply)) 
{ 
    printf("socket read failed: %s", streror(errno)); 
    exit(-1) 
} 

printf("got reply: %d\n", ntohl(reply)); 

在一個單獨的音符......即表示您在服務器上收到262144 ...是改變之前或之後,我建議? 262144是0x00040000 - 所以......你確實得到了4,而不是你期望得到它的地方。因此,您使用的是32位整數(我應該已經意識到這一點),這意味着您要使用htonl()ntohl()而不是使用短整數轉換的htons()ntohs()

+0

我仍然有同樣的錯誤 – user2328999 2013-05-03 15:36:06

+0

我會假設你的C應用程序在你發送後退出?從你的java應用程序寫入的'broken pipe'錯誤意味着C應用程序用來發送整數的套接字不再存在。我剛剛編輯了我的答案,提到在編輯問題以包含錯誤輸出後。 – 2013-05-03 15:37:07

+0

不,我不關閉套接字,我只是有printf(緩衝區);顯示服務器的答案。在服務器中,我沒有收到4,但是262144 – user2328999 2013-05-03 15:43:00

相關問題