2012-07-24 150 views
0

會安裝valgrind告訴我問題是什麼,但不幸的是不能在這臺計算機上的任何新程序......任何人都可以告訴我,如果這個「回聲」程序存在明顯的問題?這樣做是爲了朋友,所以不知道客戶端的佈局是什麼,但我知道讀寫都是有效的套接字描述符,並且我測試了n = write(寫道,「我得到了你的消息\ n「,20);和n =寫(讀,「我收到了你的消息\ n」,20);這兩個工作都可以確認它不是無效fd的情況。謝謝!套接字讀/寫錯誤

int 
main(int argc, char** argv) { 


int reads = atoi(argv[1]) ; 
int writes = atoi(argv[3]) ; 
int n ; 


    char buffer[MAX_LINE]; 
    memset(buffer, 0, sizeof(buffer)); 



    int i = 0 ; 
    while (1) { 
    read(reads, buffer, sizeof(buffer)); 
    n = write(writes,buffer,sizeof(buffer)); 
    if (n < 0) perror("ERROR reading from socket"); 

    } 
+0

在發生錯誤時檢查read()結果。使用memset的 – 2012-07-24 14:42:13

回答

0
  1. memset()是不需要的,只要你更改以下(你應該做的不過)。
  2. read()有一個結果,告訴你它實際上讀了多少。這個你應該給write(),以便只寫出你實際擁有的東西,而不需要調零。
  3. MAX_LINE應該至少爲512,如果不是更多。

可能還有一些問題,但我認爲我有最重要的問題。

+0

不會對成功與否產生任何影響。 max_line> 512時也是如此。無論哪種方式仍然不起作用:( – user1018513 2012-07-24 14:57:42

+0

你是對的,我的要點是2.,這可能會影響很多。順便說一句:你還沒有告訴我們什麼是真正的問題... – glglgl 2012-07-24 15:01:37

+0

當我嘗試時程序崩潰讀書。 – user1018513 2012-07-24 15:23:32

1

存在一些問題,其中最緊迫的是您在寫入時可能通過使用sizeof(buffer)將垃圾數據向下寫入套接字。假設您從讀取套接字讀取數據,並且它小於MAX_LINES。當你寫這些數據的時候,你會寫任何你讀的東西加上緩衝區末尾的垃圾(儘管你在一開始就memset,連續使用相同的緩衝區而不響應不同的讀取大小可能會產生一些垃圾。

嘗試讀取得到的返回值,並在寫入使用它。如果讀返回指示錯誤,清理,要麼退出或再試一次,這取決於你想如何你的程序的行爲。

int n, size; 
while (1) { 
    size = read(reads, buffer, sizeof(buffer)); 

    if (size > 0) { 
     n = write(writes, buffer, size); 

     if (n != size) { 
      // write error, do something 
     } 
    } else { 
     // Read error, do something 
    } 
} 

這當然,假定您的寫入和讀取是有效的文件描述符。

1

帖e兩行看起來非常可疑:

int reads = atoi(argv[1]) ; 
int writes = atoi(argv[3]) ; 

你真的在命令行上得到文件/套接字描述符號嗎?來自哪裏?

檢查您的read(2)write(2)的返回值,然後查看errno(3)的值 - 它們可能會告訴您文件描述符無效(EBADF)。

+0

沒有我的文件描述符是肯定有效的(通過我可以執行n =寫入(讀取,「我得到了你的消息\ n」,20),並在另一邊接收它 – user1018513 2012-07-24 15:12:18

+0

,如果我在隨機值中讀取,或寫道然後我確實得到「無效的文件描述符」),但我的代碼現在默默地失敗 – user1018513 2012-07-24 15:15:02

+0

你是什麼意思的「默默」? – 2012-07-24 15:16:10

1

到目前爲止還沒有提出的一點:雖然你知道文件描述符是有效的,但你應該包括一些對命令行的完整性檢查。

if (argc < 3) { 
     printf("usage: foo: input output\n"); 
     exit(0); 
} 

即使有這種理智檢查在命令行中傳遞這樣的參數可能是危險的。