我想快速的知道某个IP地址某个端口是否在监听?

cococut 2005-03-18 11:05:56
我想tcp连接的时候,感觉很慢,特别是不在同一个局域网上的时候。
比如:
132.12.12.1连接143.34.34.3 这种的,要等待很长时间后,才返回不能建立连接,
我想要很快返回不能连接的,
有没有别的编程的办法?
哪有代码可以实现?
谢谢!
...全文
270 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cococut 2005-03-18
  • 打赏
  • 举报
回复
BOOL CTryPortDlg::DoScanPort(short dwPort)
{
DWORD g_dwTimeOut = 1000; //连接超时时间,以ms计

DWORD dwRet;
short nPort =dwPort;
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
{
AfxMessageBox("创建套接字失败!");
dwRet = -1;
}
else
{
unsigned long flag = 1;
if ((ioctlsocket(sock, FIONBIO, &flag) != 0))
{
AfxMessageBox("未能改为非阻塞模式!");
dwRet = -1;
}
else
{
unsigned long g_ulAddr = INADDR_NONE;
sockaddr_in severAddr;
severAddr.sin_family = AF_INET;
severAddr.sin_port = htons(nPort);
severAddr.sin_addr.S_un.S_addr = inet_addr("198.16.16.122");

connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));

struct fd_set mask;
FD_ZERO(&mask);
FD_SET(sock, &mask);

struct timeval timeout;
timeout.tv_sec = g_dwTimeOut / 1000;
timeout.tv_usec = g_dwTimeOut % 1000;

switch(select(0, NULL, &mask, NULL, &timeout))
{
case -1:
dwRet = -1;
break;

case 0:
dwRet = 0;
break;

default:
dwRet = 1;
};
}
closesocket(sock);
}
if (dwRet == 1)
{
return TRUE;
}
else
{
return FALSE;
}
return dwRet;

}
谢谢大家,简单的做超时,可以满足我的要求!
zengwujun 2005-03-18
  • 打赏
  • 举报
回复
mark
sharkhuang 2005-03-18
  • 打赏
  • 举报
回复
netstat
jerry 2005-03-18
  • 打赏
  • 举报
回复
下面这段程序就是一个TCP探测的例子,当然,并没有做得完美,因为没有接收部分,而在WIN2000下实际就是一个选择性的SNIFFER,呵呵,大家可以使用其他的SNIFFER来实现同样的目的。也可以改变下面的程序只发送IP包,利用ICMP特性来实现探测。

#include <stdio.h>;
#include <winsock2.h>;
#include <ws2tcpip.h>;

#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255

typedef struct ip_hdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度(字节)
unsigned short ident; //16位标识
unsigned short frag_and_flags; //3位标志位
unsigned char ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IPHEADER;

typedef struct tsd_hdr //定义TCP伪首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //协议类型
unsigned short tcpl; //TCP长度
}PSDHEADER;

typedef struct tcp_hdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
unsigned int th_seq; //32位序列号
unsigned int th_ack; //32位确认号
unsigned char th_lenres; //4位首部长度/6位保留字
unsigned char th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCPHEADER;

//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >;1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >;>; 16) + (cksum &; 0xffff);
cksum += (cksum >;>;16);
return (USHORT)(~cksum);
}

void usage()
{
printf(";******************************************\n";);
printf(";TCPPing\n";);
printf(";\t Written by Refdom\n";);
printf(";\t Email: refdom@263.net\n";);
printf(";Useage: TCPPing.exe Target_ip Target_port \n";);
printf(";*******************************************\n";);
}

int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;

char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;

usage();

if (argc!= 3)
{ return false; }

if (WSAStartup(MAKEWORD(2,2), &;WSAData)!=0)
{
printf(";WSAStartup Error!\n";);
return false;
}

if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
printf(";Socket Setup Error!\n";);
return false;
}
flag=true;
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&;flag,sizeof(flag))==SOCKET_ERROR)
{
printf(";setsockopt IP_HDRINCL error!\n";);
return false;
}

nTimeOver=1000;
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&;nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
{
printf(";setsockopt SO_SNDTIMEO error!\n";);
return false;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));
addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);

//
//
//填充IP首部
ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
// ipHeader.tos=0;
ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident=1;
ipHeader.frag_and_flags=0;
ipHeader.ttl=128;
ipHeader.proto=IPPROTO_TCP;
ipHeader.checksum=0;
ipHeader.sourceIP=inet_addr(";本地地址";);
ipHeader.destIP=inet_addr(argv[1]);

//填充TCP首部
tcpHeader.th_dport=htons(atoi(argv[2]));
tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号
tcpHeader.th_seq=htonl(0x12345678);
tcpHeader.th_ack=0;
tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
tcpHeader.th_win=htons(512);
tcpHeader.th_urp=0;
tcpHeader.th_sum=0;

psdHeader.saddr=ipHeader.sourceIP;
psdHeader.daddr=ipHeader.destIP;
psdHeader.mbz=0;
psdHeader.ptcl=IPPROTO_TCP;
psdHeader.tcpl=htons(sizeof(tcpHeader));

//计算校验和
memcpy(szSendBuf, &;psdHeader, sizeof(psdHeader));
memcpy(szSendBuf+sizeof(psdHeader), &;tcpHeader, sizeof(tcpHeader));
tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &;ipHeader, sizeof(ipHeader));
memcpy(szSendBuf+sizeof(ipHeader), &;tcpHeader, sizeof(tcpHeader));
memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));

memcpy(szSendBuf, &;ipHeader, sizeof(ipHeader));

rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
0, (struct sockaddr*)&;addr_in, sizeof(addr_in));
if (rect==SOCKET_ERROR)
{
printf(";send error!:%d\n";,WSAGetLastError());
return false;
}
else
printf(";send ok!\n";);

closesocket(sock);
WSACleanup();

return 0;
}
sdwalnut1 2005-03-18
  • 打赏
  • 举报
回复
关注~
ndy_w 2005-03-18
  • 打赏
  • 举报
回复
我想要很快返回不能连接的
------------------------
意思是很快返回“在一定时间内”不能连接的吧?总得等等看吧?
老夏Max 2005-03-18
  • 打赏
  • 举报
回复
不尝试链接怎么能确定是否在监听?
关注!
吹泡泡的小猫 2005-03-18
  • 打赏
  • 举报
回复
使用半开扫描方式,直接发送ask IP包,看看是否有回应,有没有都返回,不用建立连接,就比较快。
需要对TCP/IP的三次握手协议很了解

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧