2013-05-20 45 views
1

我正在做一個Unix,C的作業。我正在創建一個服務器和一個將互相交互的客戶端。我很確定我已經建立了基本框架,但是當我嘗試發送/接收消息時,它不起作用。如何使用套接字在服務器和客戶端之間進行通信? [C]

這裏是服務器while循環代碼,我想只顯示相關代碼:

while(1) { 
      clntAdrLen = sizeof(clntAddr); 
      clntFd = accept(srvrFd, (struct sockaddr*)&clntAddr, NULL); 
      if (fork() == 0) { 
        send(clntFd, "YourMessage", 12, NULL); 
        close(clntFd); 
        exit(0); 
      } else { 
        close(clntFd); 
      } 
} 

這裏是客戶端的代碼:

do { 
      result = connect(srvrFd, (struct sockaddr*)&srvrAddr, srvrLen); 
      if(result==-1) { 
        sleep(1); 
      } 
      recv(srvrFd, buf, sizeof(buf), NULL); 
      printf("%s", buf); //here I try to print the message sent by server 
    } while (result==1); 

當我運行這兩個服務器和客戶端,它應該打印「YourMessage」。相反,它打印:

N0�, 

我只是做錯了?由於

+0

你能打印clntFd的值嗎? – carlosdc

+0

哦,他打印「-1」。不好。你認爲這是客戶的問題嗎? –

+0

是。這是你所有問題的核心。 – carlosdc

回答

1

我想你的問題是在接受函數。

如Linux的程序員手冊說:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 

的addrlen中參數是一個值結果參數:主叫方必須初始化它含有的大小(以字節爲單位)的結構由addr指向的;在返回時它將包含對等地址的實際大小。

+0

是的,就是這樣。我認爲當我搞亂send函數時,我意外地將它改爲NULL。它現在正確地工作,謝謝你。 –

-1

請你幫個忙,給自己買「UNIX網絡編程」 ISBN-10:0139498761

有更多的方式來Socket編程比滿足眼睛。

首先,你如何知道接收端發送的字符串有多長?你會認爲它總是12,在大多數實際例子中,它不會每次都是一樣的。

你打算閱讀,直到你打到字符串的結尾,或者你打算在開始時發送一個整數來告訴讀者長度是多少?

如果您使用整數,您是否知道endian-ness?

如果我們爲你做作業,你真的要學習什麼嗎?大概你在大學裏付學費。你在那裏通過或你在那裏學習?

相關問題