2013-04-21 114 views
-1

我想使用FIFO和客戶端獲取目錄路徑的服務器 - 客戶端模型,但出現錯誤「讀取:錯誤的地址」和「寫入:錯誤的地址」。C:「讀取:錯誤的地址」和「寫入:錯誤的地址」

客戶

服務器的錯誤: 「讀:錯誤地址」

客戶端的錯誤: 「寫:錯誤地址」

+0

閱讀關於C編程和對一些好書Linux編程。使用'strlen(pathName)'作爲'read'的長度參數確實是錯誤的,並且表明你很困惑...在花了一兩天的時間閱讀好材料之後,再次編寫你的程序,使用'gcc -Wall -g',改進它直到沒有任何警告,並使用'gdb'調試器進行調試。 – 2013-04-21 13:17:37

回答

0

也許你從readwrite濫用的返回值。成功後,他們會返回正面的價值觀,並將他們視爲錯誤。

此外,當閱讀字符串的大小是未知的。所以strlen是不合適的。

if((controlRead = read(fdp,pathName,sizeof(pathName))) <= 0) 
{ 
    // error ... 

write相同的條件。

當傳送字符串,它是傳遞字符串長度以及一個好主意:

寫作:

void write_string(int fd, const char *string) 
{ 
    size_t len = strlen(string); 
    write(fd, &len, sizeof(len)); 
    write(fd, string, len); 
} 

閱讀:

void read_string(int fd, char *buffer, size_t size, size_t *len) 
{ 
    size_t t_len; 

    read(fd, &t_len, sizeof(t_len)); 
    if (t_len > size) t_len = size; 
    read(fd, buffer, t_len); 
    if (t_len < size) buffer[t_len] = 0; // null-terminate if there is enough space 
    if (len) *len = t_len; // return length if wanted 
} 
+0

不,'strlen(pathName)'應該是'sizeof(pathName)' – 2013-04-21 13:20:34

+0

@BasileStarynkevitch是的,那也是。謝謝。 – 2013-04-21 13:21:40

+0

謝謝你這麼多問題解決了 – CSoft 2013-04-21 13:35:21