如何判定网络上某台服务器的某个端口是否开通?

时间:2022-12-13 15:20:53
如何判定网络上某台服务器的某个端口是否开通?

试过几个方法,但均不理想。
其一,通过Ping方法。但此种方法仅可以判定指定IP的机器是否在网上,而无法确定指定端口是否开通(例如80端口是否开通,即是否有HTTP服务)
其二,通过Socket方法。此种方法建立一个socket连接,如果可以建立连接,则表示端口开通。但此种方法的运行速度其慢无比,无法忍受。

不知那位大侠有更好的解决方案?搞定后,给主要回答者再加100分。

15 个解决方案

#1


如果是手工判断,你可以运行telnet xxx.xxx.xxx.xxx 80测试
如果是代码你可以这样,用select函数,或者用connect连接到80端口看连接是否成功

#2


gz

#3


如果你只是判断大量断口,socket去连接,同时开多个线程,很快的。

#4


自己编写socket程序,速度还可以,如果想快一点的话,开N个线程去connect,结果写入日志,然后查日志

#5


各位大侠可以写一个Socket的小例子吗?我的很简单,大家给看看有什么问题?有什么多余的或者缺省的???

我计划在一个列表中遍历(列表中放有若干个IP地址),如果发现可连接的,就终止后面的查找。

SOCKADDR_IN saServer;
LPHOSTENT lphostent;
WSADATA wsadata;
SOCKET hsocket;
int nRet;
    
if(WSAStartup(winsock_version,&wsadata))
  return FALSE;

lphostent=gethostbyname(lpszHostName); //IP地址
if(lphostent==NULL)
  return FALSE;

hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

saServer.sin_family = AF_INET;
saServer.sin_port = htons(UPORT);   //端口,常量80 
saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);

nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR){
     closesocket(hsocket);
   return FALSE;
    }

//至此,可确定成功地找到了要求的主机。

#6


其二,通过Socket方法。此种方法建立一个socket连接,如果可以建立连接,则表示端口开通。但此种方法的运行速度其慢无比,


可以自己设置时间长短呀

#7


楼上的建议你开多线程来connect比较快你可以试试阿,把你的代码改成一个线程形式就可以了

#8


救救我吧,各位大侠!
我上面的代码执行一次大约要5秒钟,太慢了!

#9


还是没有人能够回答我,唉!郁闷呀!

#10


没有其它的办法吗?只有用socket的connect方法吗?如何设置超时呀?就是过了相当长的一段时间了,可是connect还是没有返回。我可不可以认定超时没有返回就是网络不通或者说是无法建立socket连接呢?可以给一个示例吗?
真心地谢谢各位大侠了!!

#11


// 这是我昨天写的一个连接端口的测试程序,在我这边可用
你按照你的需要改改,MAIL_MESSAGE改为你需要的结构体
UINT SendPacketThread(LPVOID lparam)
{
CShortLink* pSocketS = (CShortLink*)lparam ;

int  PORT;
char ServerIP[16];
PORT = 3330;
strcpy(ServerIP , "200.200.200.229");
while(1)
{
if(!pSocketS->Create())
{
AfxMessageBox("Create Socket Failed!");
pSocketS->Close();
}
else
{
if(!pSocketS->Connect((LPCTSTR)ServerIP , PORT))
{
AfxMessageBox("连接服务器失败,请检查网络是否连通!");
                continue;
}
else
{
MAIL_MESSAGE m_Message;
memset(&m_Message , 0 , sizeof(MAIL_MESSAGE));
m_Message.cFeeUserType = 0;
m_Message.nAction = 0;
m_Message.nMsgFormat = 15;
m_Message.nNeedReply = 0;
strcpy(m_Message.szCompanyID , "-YJML");
strcpy(m_Message.szDestID , "13988886666");
strcpy(m_Message.szFeecode , "0010");
strcpy(m_Message.szFeetype , "02");
strcpy(m_Message.szSrcID , "13988886666");
strcpy(m_Message.szSubject , "清早起床 ,提着裤子上茅房");

pSocketS->Send(&m_Message , sizeof(MAIL_MESSAGE));
pSocketS->Close();
}
}

Sleep(5000);

}
return 0;
}

#12


再顶上一次看看吧,今天下午再没有高人相帮助的话就结帐喽

#13


记得有人用ACT方式连接,也是只握手二次,这样很快,但我不是很清楚:)

#14


网上有多线程端口扫描代码,很快。

#15


多线程

#1


如果是手工判断,你可以运行telnet xxx.xxx.xxx.xxx 80测试
如果是代码你可以这样,用select函数,或者用connect连接到80端口看连接是否成功

#2


gz

#3


如果你只是判断大量断口,socket去连接,同时开多个线程,很快的。

#4


自己编写socket程序,速度还可以,如果想快一点的话,开N个线程去connect,结果写入日志,然后查日志

#5


各位大侠可以写一个Socket的小例子吗?我的很简单,大家给看看有什么问题?有什么多余的或者缺省的???

我计划在一个列表中遍历(列表中放有若干个IP地址),如果发现可连接的,就终止后面的查找。

SOCKADDR_IN saServer;
LPHOSTENT lphostent;
WSADATA wsadata;
SOCKET hsocket;
int nRet;
    
if(WSAStartup(winsock_version,&wsadata))
  return FALSE;

lphostent=gethostbyname(lpszHostName); //IP地址
if(lphostent==NULL)
  return FALSE;

hsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

saServer.sin_family = AF_INET;
saServer.sin_port = htons(UPORT);   //端口,常量80 
saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);

nRet = connect(hsocket, (LPSOCKADDR)&saServer, sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR){
     closesocket(hsocket);
   return FALSE;
    }

//至此,可确定成功地找到了要求的主机。

#6


其二,通过Socket方法。此种方法建立一个socket连接,如果可以建立连接,则表示端口开通。但此种方法的运行速度其慢无比,


可以自己设置时间长短呀

#7


楼上的建议你开多线程来connect比较快你可以试试阿,把你的代码改成一个线程形式就可以了

#8


救救我吧,各位大侠!
我上面的代码执行一次大约要5秒钟,太慢了!

#9


还是没有人能够回答我,唉!郁闷呀!

#10


没有其它的办法吗?只有用socket的connect方法吗?如何设置超时呀?就是过了相当长的一段时间了,可是connect还是没有返回。我可不可以认定超时没有返回就是网络不通或者说是无法建立socket连接呢?可以给一个示例吗?
真心地谢谢各位大侠了!!

#11


// 这是我昨天写的一个连接端口的测试程序,在我这边可用
你按照你的需要改改,MAIL_MESSAGE改为你需要的结构体
UINT SendPacketThread(LPVOID lparam)
{
CShortLink* pSocketS = (CShortLink*)lparam ;

int  PORT;
char ServerIP[16];
PORT = 3330;
strcpy(ServerIP , "200.200.200.229");
while(1)
{
if(!pSocketS->Create())
{
AfxMessageBox("Create Socket Failed!");
pSocketS->Close();
}
else
{
if(!pSocketS->Connect((LPCTSTR)ServerIP , PORT))
{
AfxMessageBox("连接服务器失败,请检查网络是否连通!");
                continue;
}
else
{
MAIL_MESSAGE m_Message;
memset(&m_Message , 0 , sizeof(MAIL_MESSAGE));
m_Message.cFeeUserType = 0;
m_Message.nAction = 0;
m_Message.nMsgFormat = 15;
m_Message.nNeedReply = 0;
strcpy(m_Message.szCompanyID , "-YJML");
strcpy(m_Message.szDestID , "13988886666");
strcpy(m_Message.szFeecode , "0010");
strcpy(m_Message.szFeetype , "02");
strcpy(m_Message.szSrcID , "13988886666");
strcpy(m_Message.szSubject , "清早起床 ,提着裤子上茅房");

pSocketS->Send(&m_Message , sizeof(MAIL_MESSAGE));
pSocketS->Close();
}
}

Sleep(5000);

}
return 0;
}

#12


再顶上一次看看吧,今天下午再没有高人相帮助的话就结帐喽

#13


记得有人用ACT方式连接,也是只握手二次,这样很快,但我不是很清楚:)

#14


网上有多线程端口扫描代码,很快。

#15


多线程