socket返回值為0的問題排查

2021-08-27 20:52:30 字數 1038 閱讀 7259

lte中,enb和mme之間通過s1ap協議交流,而s1ap的底層協議為sctp。因此s1鏈路的建立,要依賴於sctp底層鏈路的建立。需要配置的sctp引數包括:

本地ip、本地埠號、遠端ip、遠端埠號、心跳間隔、最大路徑重傳次數、init最大重傳次數、輸入輸出流個數等。

而建立socket是sctp建立連線的先決條件,我們使用的時socket函式建立的套接字:

int socket_id = int

socket(int af, int type, int protocol);

將配置傳送給sctp鏈路管理模組,觸發sctp的建立。但是日誌顯示,利用socket建立的socket_id為0。

通過在網上查閱了一些文章,發現socket建立的時候,socket_id是0,1,2的基本屬於標準輸入輸出套接字標識。通常使用者自己建立的socket不會出現這個問題。

socket_id為0,1,2的雖然是給標準輸入輸出用的,但是如果我們close(0)之後,該socket_id = 0的便處於「空閒」狀態。使用者利用socket函式建立套接字時,便會講0分配給新建立的socket。

經過查詢close函式使用的地方,最終定位到了一處:

1、該模組上下文初始化時,全被初始化為了0,該上下文結構體如下:

typedef struct _wireshark_global_contxt_t

wireshark_global_context_t;

2、該模組初始化時,會建立初始socket連線

該模組建立socket連線時,只允許建立乙個連線,因此為了防止存在多個連線的情況,在呼叫socket函式建立socket之前,加入了如下判斷

if (wiresahrk_gl_ctx.udp_sock_id >= 0)

於是就出現了close(0)的情況。

1、上下文初始化時,將udp_sock_id初始化為非法值(-1)

2、close() socket連線的時候,判斷條件為》0的情況下close

c 賦值(賦值為函式返回值)語句的返回值問題

不知道為什麼,之前一直腦子裡有乙個誤解,賦值語句的返回值應該是1 成功賦值 或0 賦值失敗 今天其實在學linux的時候突然揣摩了一下 才發現這個問題 if dir opendir home ljz desktop null opendir返回空說明目錄開啟失敗 這句 裡面 null的判斷在 dir...

socket讀寫返回值的處理

在呼叫socket讀寫函式read write 時,都會有返回值。如果沒有正確處理返回值,就可能引入一些問題 總結了以下幾點 1當read 或者write 函式返回值大於0時,表示實際從緩衝區讀取或者寫入的位元組數目 2當read 函式返回值為0時,表示對端已經關閉了 socket,這時候也要關閉這...

socket讀寫返回值的處理

在呼叫socket讀寫函式read write 時,都會有返回值。如果沒有正確處理返回值,就可能引入一些問題 總結了以下幾點 1當read 或者write 函式返回值大於0時,表示實際從緩衝區讀取或者寫入的位元組數目 2當read 函式返回值為0時,表示對端已經關閉了 socket,這時候也要關閉這...