socket的connect()函数

Big鹏 2008-11-27 07:43:59
在socket编程中扫描tcp端口来发现主机是否在线,共设置了五个端口,当设置成25,80时,测试时不管主机是否在线,都能显示出来,并提示主机在线,请问是什么原因?
本人有如下疑问或猜想:(1)是不是connect()的问题?(2)connect的阻塞和非阻塞是什么意思??
部分源代码如下:

//调用辅线程来循环扫描每个端口
DWORD WINAPI psProc(
LPVOID lpParameter // thread data
)
{

//创建套接字
SOCKET psSock = socket ( AF_INET, SOCK_STREAM, 0 ); //返回值为类似于文件描述符的句柄;

//sockaddr_in结构
struct sockaddr_in psAddr;

if( psSock == INVALID_SOCKET )
{
printf( "Error: socket \n" );
exit(1);
}

//将psAddr中的前sizeof( psAddr )个字符都替换成0
memset( &psAddr, 0, sizeof( psAddr ) );

//填充sockaddr结构
psAddr.sin_family = AF_INET; //表示所属地址簇,TCP/IP必须是AF_INET
psAddr.sin_addr.S_un.S_addr = inet_addr( g_szTargetIP );
psAddr.sin_port = htons( g_nTargetPort );
//是不是connect()的问题??
if( connect( psSock, ( sockaddr* )&psAddr, sizeof( psAddr ) ) != SOCKET_ERROR )
{
printf( "\n端口 %d 开放", ntohs( psAddr.sin_port) );
nPortNumber++; //扫描出的端口数目统计
}

//关闭监听套接字
closesocket( psSock );
return 0;
}
...全文
2462 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gccdy 2008-11-27
  • 打赏
  • 举报
回复
去这下一个<C++网络编程基础>,可能会对你有点点帮助
http://dniit.download.csdn.net
bill830711 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xhs_lh04 的回复:]
在阻塞模式下对connect调用都是等到调用请求完成再返回的,也就是说,如果调用请求未处理完,调用程序将处于挂起状态,如果程序只有一个线程也就成了通常说的程序没有响应。调用完成,函数将返回相应的调用结果。如果套接字是非阻塞模式的,那么对connect函数的调用会马上返回,通过返回码检查是否连接成功
[/Quote]

阻塞模式如上所说。
但是非阻塞稍微有点出入,非阻塞调用是connect会立即返回,接下来就要对sockfd进行检测以确认连接是否建立,这种情况一般代理中用的比较多
zengkun100 2008-11-27
  • 打赏
  • 举报
回复
楼主你调了wsastartup么?
就呆在云上 2008-11-27
  • 打赏
  • 举报
回复
2楼数阻塞和非阻塞的比较好是说法

个人感觉你的第一个问题确实有点意思
我的理解:
ntohs( psAddr.sin_port)
sin_port是你作为客户端输入的一个数据,但是你打印他的条件仅仅是!= SOCKET_ERROR ,貌似不对吧
链接失败有很多中错误返回的,只要不是这种就可以了吧
Big鹏 2008-11-27
  • 打赏
  • 举报
回复
端口25是SNMP服务的端口,80是HTTP服务的端口
如果主机这两个服务(一般都是)都开启着,当然能建立到连接

但是主机没开启时,也提示该两个端口在呀,结果造成错误的判断!

xhs_lh04 2008-11-27
  • 打赏
  • 举报
回复
在阻塞模式下对connect调用都是等到调用请求完成再返回的,也就是说,如果调用请求未处理完,调用程序将处于挂起状态,如果程序只有一个线程也就成了通常说的程序没有响应。调用完成,函数将返回相应的调用结果。如果套接字是非阻塞模式的,那么对connect函数的调用会马上返回,通过返回码检查是否连接成功
xhs_lh04 2008-11-27
  • 打赏
  • 举报
回复
端口25是SNMP服务的端口,80是HTTP服务的端口
如果主机这两个服务(一般都是)都开启着,当然能建立到连接

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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