1、使用TCP發送消息端口隨機問題
問題:使用exosip2 主動發送TCP消息時端口不固定;
代碼分析:
首先exoisp2中TCP方式發送數據的sock有兩種來源(eXtl_tcp.c):
《1》、tcp_tl_read_message函數中accept函數返回的socket,最多200個;
這個是作爲服務器被動連接,返回的sock綁定的端口號都是我們用eXosip_listen_addr設置的;
《2》、主動發起TCP連接時新建立的socket;
在_tcp_tlconnect_socket中創建新的socket但是有一個if判斷來決定是否進行端口綁定,判斷如下:
如果沒有進行端口綁定,就會隨機選擇一個端口號,這就是問題所在。
判斷條件中的ai_addr_len設置是在tcp_tl_open中設置,但是有一個宏控制住了,該宏默認是沒定義的,如下:
所以如果把該宏打開我們就能使用我們設置的端口號發送數據了,但是該 宏ENABLE_MAIN_SOCKET的作用並沒有提及,所以不知道開啓後會有什麼影響。eXtl_tls.c中說是阻止不安全的tls連接,感覺和tcp的是沒有關係的。
2、額外設置
需要將eXtl_tcp.c中的被設置爲SO_REUSEADDR 的sock,再在此基礎上添加SO_REUSEPORT,不然發送消息的sock創建失敗。
setsockopt (sock, SOL_SOCKET, SO_REUSEPORT, (void *) &valopt, sizeof (valopt));