乙個多socket繫結同乙個埠的測試程式

2021-04-23 00:01:49 字數 2312 閱讀 8724

測試目標:建立多個socket的測試

測試環境:suse linux

測試步驟:建立了3個socket,但是由於繫結了不同的埠,可以邦定成功;假如繫結相同的埠,則相繼失敗。而關閉socket的時候,呼叫shutdown失敗,而close卻可以成功。

在stevens的書本中,則建議使用shutdown來關閉,但是,不成功。

測試結果:

goal: test multi socket could be binded in the same port

creating socket:

socket is created: 3

socket is created: 4

socket is created: 5

current pid: %d

18116

bind socket:

binding the 8000 port

binding the 8001 port

binding the 8002 port

shut down  the socket

shut down socket 1 error

shut down socket 2 error

shut down socket 333 error

疑問:1、為什麼乙個程式不同的socket不可以邦定同乙個埠呢?

2、為什麼shutdown失敗?而close則可以成功呢?

3、為什麼多個程序裡面,每個程序都有乙個socket,多個程序繫結的卻是同乙個埠,還是失敗呢?

測試源**:

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

using

namespace std;

int bind_socket(int sock, int port);

int create_socket();

int main(int argc, char** argv)

std::cout << "binding the "

<< port_2 << " port"

<< endl;

if(bind_socket(socket_2, port_2) == -1 )

std::cout << "binding the "

<< port_3 << " port"

<< endl;

if(bind_socket(socket_3, port_3) == -1 )

std::cout << "/n/nshut down  the socket"

<< endl;

if(shutdown(socket_1, shut_rdwr) == -1)

if(shutdown(socket_2, shut_rdwr) == -1)

if(shutdown(socket_3, shut_rdwr) == -1)

return 1; 

}int create_socket()

return s;

}int bind_socket(int sock, int port)

if(port <= 1024)

memset(&addr, 0, sizeof(addr));

addr.sin_port = htons (port);

addr.sin_family = af_inet;

int ret = bind(sock,(struct sockaddr *)&addr, sizeof(addr));

if( ret < 0) 

return ret;   }

結果分析:

問題1:同事告訴我可以的,結果證明不行。說明ericsson的tsp的強大性,哈哈

問題2:看來就用close吧。在tsp封裝後的介面中,使用的是close而不是shutdown,在通用程式中,也是使用close居多。而兩者的最大區別就是socket descriptor dup之後的差別,也就是說,不把socket descriptor dup的話,兩者效果一樣。

問題3:我使用的測試程式是:啟動程式,然後fork兩個程序,每個都建立乙個socket,這樣3個socket都繫結到了同乙個埠,結果失敗。因此,並不是每個程序都可以偵聽同乙個埠的。這樣一說,也不難理解啦。

歡迎拍磚!

同乙個IP繫結2個網域名稱

technorati 標籤 ip,網域名稱 同乙個ip繫結2個網域名稱 假設已經在isp那裡申請了2個網域名稱www.test1.com www.test2.com,而且都是繫結到伺服器的公網ip是192.168.1.100.test1是apache在本機的乙個應用,訪問url為http 192.1...

多個按鈕繫結同乙個點選事件

div class div1 ul class link li 點選 li li 點選 li li 點選 li ul ul li 點選 li li 點選 li li 點選 li ul ul li 點選 li li 點選 li li 點選 li ul div script document ready...

實現同乙個使用者只能有乙個登入

1.在登入系統時,得到username 資料庫唯一 宣告個map key為username value 為sessionid 並放入快取中。2.寫乙個filter 類 每次請求 用username 從快取 的map裡 取出sessionid 如果不一致。remove 當時的sessionid 3.登...