天天看點

linux 下的C/S程式

在看完linux程式設計中關于socket套接字這一章套接字的通信流程的介紹後,自己寫了用戶端和伺服器端的程式。發現了一些需要注意的問題。

用戶端:

套接字internet位址s_addr不能直接用127.0.0.1或者是這個字元串“127.0.0.1”來指派,而是應該使用inet_addr("127.0.0.1").

在connect函數中,address_len不應該直接寫數字,比如4,而是應該用sizeof(address) ,這裡的address是套接字位址,struct sockaddr_in類型。

connect函數中的address不能直接用sockaddr_in類型變量的位址,而是應該将這個位址加一個(struct sockaddr*)強制類型轉換

write函數中的三個參數,而不是直接一個字元串。三個參數分别為用戶端套接字,第二個為要發送的資料的緩存位址,後面一個資料長度,直接用數字。

close()中應該有一個參數,為套接字。

socket函數中第三個參數應該寫上,預設為0。

socket函數傳回的是一個int類型的描述符,最好不要用它來判斷套接字是否建立成功。

伺服器端:

read()函數中的第一個參數為用戶端的描述符,而不是伺服器端的描述符。

accept()函數的第三個參數應該是用戶端的位址長度的指針,不能用&sizeof(address)作實參,sizeof傳回對象等,應該用int  len=sizeof(address);  然後實參&len。并且在&len之前要加上(socklen_t *__restrict)進行強制轉換。

accept()函數的第二個參數是用戶端的address指針,不是伺服器的address指針。且要進行類型轉換。

在close()中的描述符是由accept傳回的用戶端描述符,而不是伺服器描述符。

accept()和read()應該放在while中。循環接收和讀取

如果不是在在同一台機器上,還要修改ip等。

注意:我發現一個特别搞笑但也特别值得深思的問題——在伺服器端的輸出中的\n不能省略,否則看不到資料。

另外一個有趣的事情是,将char類型換成char*後,相應輸出修改後,有和沒有\n也有差别,此時将\n換成空格也沒有資料顯示在伺服器上。為什麼呢?值得深思!