我想使用FIFO和客戶端獲取目錄路徑的服務器 - 客戶端模型,但出現錯誤「讀取:錯誤的地址」和「寫入:錯誤的地址」。C:「讀取:錯誤的地址」和「寫入:錯誤的地址」
客戶
服務器的錯誤: 「讀:錯誤地址」
客戶端的錯誤: 「寫:錯誤地址」
我想使用FIFO和客戶端獲取目錄路徑的服務器 - 客戶端模型,但出現錯誤「讀取:錯誤的地址」和「寫入:錯誤的地址」。C:「讀取:錯誤的地址」和「寫入:錯誤的地址」
客戶
服務器的錯誤: 「讀:錯誤地址」
客戶端的錯誤: 「寫:錯誤地址」
也許你從read
和write
濫用的返回值。成功後,他們會返回正面的價值觀,並將他們視爲錯誤。
此外,當閱讀字符串的大小是未知的。所以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
}
不,'strlen(pathName)'應該是'sizeof(pathName)' – 2013-04-21 13:20:34
@BasileStarynkevitch是的,那也是。謝謝。 – 2013-04-21 13:21:40
謝謝你這麼多問題解決了 – CSoft 2013-04-21 13:35:21
閱讀關於C編程和對一些好書Linux編程。使用'strlen(pathName)'作爲'read'的長度參數確實是錯誤的,並且表明你很困惑...在花了一兩天的時間閱讀好材料之後,再次編寫你的程序,使用'gcc -Wall -g',改進它直到沒有任何警告,並使用'gdb'調試器進行調試。 – 2013-04-21 13:17:37