2011-08-23

Socket Programming in C 常犯小毛病

在這個網路程式範例,似乎有滿多人不經意的這樣寫

 

char tmp[32];
memset( tmp, '\0', sizeof(tmp));
int ret = recv( sock, tmp, sizeof(tmp), 0 );
printf("%s\n", tmp)

把 buffer 填滿固然是一件好事,但是字串填滿之後,結果沒有\0了
就會發生意想不到的事情,可能會出現程式記憶體存取違規的問題
( 字元陣列的結尾正常結束都要有個 \0 才是正確的 )

假設我們不看 ret 回傳收到多大的資料,考慮使用 strcat 來把回傳的 buffer
串到更大的 buffer 字元陣列,應該要扣掉1來使用,避免發生記憶體存取違規!

char tmp[32];
int ret;
if( (ret = recv( sock, tmp, sizeof(tmp) - 1, 0 ) ) > 0 ) {
        tmp[ret] = 0x0;
        printf("%s\n", tmp);
}

如果字元陣列尾端沒有 \0 就會引起 Access Violation 記憶體存取違規。

沒有留言:

張貼留言