關於Socket中端口複用

最近在處理單位的外場遇到了一個實際問題。

在實際與第三方系統進行通信的過程中,我綁定了30009端口作爲UDP服務端,但是偶爾會發現第三方系統向30009端口發送數據的時候,通過網絡抓包可以抓到,但是我自己在 receive數據的時候卻收不到數據。而這個現象還是偶爾一段時間會出現,通過網絡抓包,看我本段的30009端口在使用向對端發送語音數據,這就是說明我的端口被佔用了,但是我啓動後就綁定了這個端口,

別人怎麼能把這個給搶佔走呢?後來發現程序裏設置了這個端口的複用

int flag = 1;

 int result = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag));

也就是說允許,其他進程再綁定這個端口。

而我是先綁定的,我們的媒體是後綁定的,那這個時候第三方系統向這個端口發送數據的話,就會有三種可能

1.先綁定的收到

2.後綁定的收到

3.都收到

然後我們在綁定ip的時候常見的有兩種形式,

1.一種是 AddrServer.sin_addr.S_un.S_addr = INADDR_ANY;也就是0.0.0.0

2.另外一種是真實的本地ip addr.sin_addr.S_un.S_addr = inet_addr("10.110.12.68");

那麼這兩種綁定對於上面的結論是否有影響呢

於是我寫了測試程序,來驗證上面的結論,在windows下驗證的結論如下:先寫結論,然後再上代碼

結論是:

1.如果兩個進程都綁定的是本地的真實ip,如 ip addr.sin_addr.S_un.S_addr = inet_addr("10.110.12.68");

那誰先綁定誰就可以收到數據。後面雖然可以綁定,但是收不到發送過來的數據。

2.如果兩個進程一個綁定的是INADDR_ANY,而一個綁定的是真實ip,那麼最終收到數據的是真實ip,我們外場遇到的問題就是這樣

的情況,在windows下操作系統下,我自己的進程先綁定了 30009端口,但是是用的INADDR_ANY綁定,而媒體進程是後綁定的端口,他是用真實的ip,所以他雖然是後綁定的,但是可以收到數據,導致我的進程收不到數據了。

但是這個結論感覺在windows下都綁定了真實的ip的情況如1,有點不合理,既然允許衝入,那麼衝入進去的應該可以收到數據啊,而反而是第一個綁定的能收到數據。

所以我又在linux下啓動udp的服務器端程序,同樣驗證上面的第一個結論,結果發現linux下和windows下不同。

結論是:

3.如果兩個進程都綁定的是本地的真實ip,如 ip addr.sin_addr.S_un.S_addr = inet_addr("10.110.12.68");

在linux操作系統中,那誰後綁定誰就可以收到數據。

那麼端口複用到底應該用到什麼場合呢,看下下面的連接就可以了,

https://network.51cto.com/art/201505/475726.htm

還有這篇文章:https://www.cnblogs.com/linehrr-freehacker/p/3309156.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章