我寫了一個程序C++
,我需要檢查一個TCP端口是否真空。C++檢查TCP端口
這是函數:
int checkport(char* host, char* port, int timeout)
{
int sock;
struct sockaddr_in sin;
int result = 0;
sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(port));
sin.sin_addr.s_addr = inet_addr(host);
fd_set fdset;
struct timeval tv;
fcntl(sock, F_SETFL, O_NONBLOCK);
int connect_result = connect(sock,(struct sockaddr*)(&sin),sizeof(struct sockaddr_in));
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
tv.tv_sec = timeout;
tv.tv_usec = 0;
int select_result = select(sock + 1, NULL, &fdset, NULL, &tv);
// printf("connect = [%d] | select = [%d]\n",connect_result,select_result);
if(select_result == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_error, &len);
// printf("so_error = [%d] \n",so_error);
if(so_error == 0)
{
//Is connected
if(hitdebug >= 4) puts("CONNECTED");
if(hitdebug >= 2) printf("[%s:%s] OPEN\n",host,port);
result = 1;
}
else
{
if(hitdebug >= 4) puts("CONNECT_ERROR_1");
result = 0;
}
}
else
{
if(hitdebug >= 4) puts("CONNECT_ERROR_2");
result = 0;
}
close(sock);
return result;
}
的問題是,只檢測監聽端口,我希望有一個端口是100%真實,甚至檢測ESTABLISHED,TIME_WAIT等..
輸出:
connect = [-1] | select = [1]
so_error = [111]
50983 TEST=[0]
tcp 0 0 1.2.3.4:50983 4.4.4.4:22 ESTABLISHED
connect = [-1] | select = [1]
so_error = [111]
43343 TEST=[0]
tcp 0 0 1.2.3.4:43343 4.4.4.4:22 ESTABLISHED
connect = [-1] | select = [1]
so_error = [0]
64000 TEST=[1]
tcp 0 0 1.2.3.4:64000 0.0.0.0:* LISTEN
tcp 0 0 1.2.3.4:47669 1.2.3.4:64000 TIME_WAIT
connect = [-1] | select = [1]
so_error = [111]
54674 TEST=[0]
connect = [-1] | select = [1]
so_error = [111]
54665 TEST=[0]
對我來說,一個空口是當我做了netstat -an | grep 12345 | wc -l
,我看到0,甚至沒有FIN_WAIT
我該如何做到這一點?
謝謝。
你可能想指定你正在使用的操作系統,C++還沒有任何與標準(這是瘋狂的)相關的網絡。儘管Unix和家族之間有相似之處,但仍然存在一些差異 –
只要嘗試「綁定」端口以便監聽 - 如果失敗(使用SO_REUSEADDR關閉,這是默認設置),那麼套接字或者處於主動使用或處於WAIT狀態之一。 – Useless
爲什麼不解析netstat輸出? – Damien