程式設計 unix socket 學習的記錄

2021-08-21 19:44:23 字數 1823 閱讀 7682

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...