1gcc ser.c -o ser
#include
#include
#include
#include
#include
#include
#define un_sock_path "/home/admin/zzk_tenda/unix_socket/server.socket"
int main(int argc, char *argv)
else
printf("socket\n");
ret = bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(server_addr));
if (ret < 0)
else
printf("bind\n");
ret = listen(sockfd, 4);
if (ret < 0)
else
printf("listen\n");
newfd = accept(sockfd, null, null);
if (newfd < 0)
else
while(1)
else
if ( recv_num == 0)/* cli 斷開時,recv: success */
遇到的問題
在這裡發現**有一些bug,比如當終止client服務時,server端還是會顯示,呼叫recv函式成功。如下所示
檢視recv函式的用法可以發現:
當應用程式呼叫recv函式時,
(1)recv先等待s的傳送緩衝中的資料被協議傳送完畢,如果協議在傳送s的傳送緩衝中的資料時出現網路錯誤,那麼recv函式返回socket_error,
(2)如果s的傳送緩衝中沒有資料或者資料被協議成功傳送完畢後,recv先檢查套接字s的接收緩衝區,如果s接收緩衝區中沒有資料或者協議正在接收資料,那麼recv就一直等待,直到協議把資料接收完畢。當協議把資料接收完畢,recv函式就把s的接收緩衝中的資料copy到buf中(注意協議接收到的資料可能大於buf的長度,所以 在這種情況下要呼叫幾次recv函式才能把s的接收緩衝中的資料copy完。recv函式僅僅是copy資料,真正的接收資料是協議來完成的),
recv函式返回其實際copy的位元組數。如果recv在copy時出錯,那麼它返回socket_error;如果recv函式在等待協議接收資料時網路中斷了,那麼它返回0。
上述情況屬於網路中斷,recv返回的是0。因此只要加上乙個判斷,當recv返回的資料是0時,則顯示網路斷開即可。
Unix Socket程式設計簡介
閱讀本文需要對tcp有基本的了解,對tcp連線的建立 斷開,以及tcp執行過程中狀態轉換不了解的童鞋可以首先閱讀我的另一篇部落格 unix linux作業系統暴露給應用層的網路程式設計介面是socket,下面我們對socket程式設計進行個簡單的介紹 client server程式設計模型是使用最廣...
Unix socket 程式設計API二之輔助函式
一 網路位元組序跟主機位元組序轉換 include uint32 t htonl uint32 t hostlong host to network long uint16 t htons uint16 t hostshort host to network short uint32 t ntohl...
unix socket 的緩衝區大小
1 預設大小 tcp cat proc sys net ipv4 tcp rmem 4096 87380 4161536 其中 87380為預設接收緩衝的大小 cat proc sys net ipv4 tcp wmem 4096 16384 4161536 其中16384為預設傳送緩衝的大小 ud...