2012-01-01 16 views
2

我是一個初學者在Linux環境下的套接字編程。在Linux中的套接字編程:發送()

代碼:

void proccess_server(int s) 
{ 

    ssize_t size =0 ; 
    char buffer[1024]; 
    for(;;) 
    { 
     printf("proccess:%d proccessing socket :%d\n",getpid(),s); 
     size = recv(s,buffer,sizeof(buffer),0); 

     if(0 == size) 
      return ; 
     sprintf(buffer,"Response from server:%d,%d bytes altogether\n",getpid(),size); 

     send(s,buffer,strlen(buffer)+1,0); 
    } 

} 

,我不明白爲什麼len PARAM在send()send(s,buffer,strlen(buffer)+1,0);

再添字節(strlen(buffer)+1)請幫幫我!

+0

這段代碼都是錯誤的,你在哪裏找到它的?它不檢查錯誤情況(size == -1),並且它期望「buffer」在沒有檢查的情況下被終止,因此它存在安全缺陷。 – BatchyX 2012-01-01 11:12:49

+0

呃..這是一個簡單的教程,展示了我的教科書中的網絡編程API。如果我想修復它,我應該在接收數據之前用\ 0填充緩衝區嗎? – 2012-01-01 14:39:35

+0

是的,你應該最多收回sizeof(buffer)-1字節。 – BatchyX 2012-01-01 17:06:46

回答

2

在C語言中,編譯器在每個字符串的末尾放置一個\ 0(NULL)字符。所以,當你使用一個字符串時,計算機可以理解字符串的結束位置。在Pascal語言的例子中,編譯器放置一個字符串前面的字節來存儲字符串的長度。

這一定是爲什麼那裏有+1的原因。

+0

我看到,我知道在字符串末尾會有一個\ 0,因爲問題是,+ 1是否意味着函數strlen()返回字符串的長度不包含\ 0? – 2012-01-01 09:23:25

+0

是的,那是對的。如果一個字符串是「abc」,strlen(「abc」)是3,但是在內存中的長度是4. – tcak 2012-01-01 10:45:16

+0

明白了!謝謝:> – 2012-01-01 14:12:14