Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128825
  • 博文数量: 70
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 380
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 18:53
文章分类
文章存档

2015年(8)

2014年(14)

2011年(1)

2010年(21)

2009年(26)

我的朋友

分类: 系统运维

2010-05-07 19:23:34

分两种情况讨论:机器连接不上或者是程序没有起来.

首先来看关于socket和TCP协议的几个基本概念.

标示一个socket,需要四元组:本机IP地址,本机端口,对端IP地址,对端端口号.有了这四个元素,才能唯一的表示一个socket.其中,IP地址是定位一台机器的,而端口号是定位机器上的一个进程的.当发起一个connect请求时,首先是根据对端的IP地址找到相应的机器,然后TCP连接数据被送往该机器的协议栈中,在协议栈中,查找是否有监听所连接端口号的程序在运行,如果有,则将该连接请求放入连接队列中.否则,将给发起连接的机器发送RST报文.

回到开始谈到的两种情况.

第一种情况,对端IP地址不能定位到一台机器,也就是说,发出去的connect请求不会被任何协议栈接受(中间经过的路由器之类的不算).TCP在这种情况下,会尝试几次连接,如果都没有连接成功,则返回超时错误.
第二种情况,机器定位到了,但是没有对应端口号的机器,则该请求会被协议栈接收,但是会返回一个RST报文.注意,这个RST报文是在对端收到三次握手的第一个报文的时候回复的.

因此,两种情况下,connect都会返回-1报错,进一步的,如果要定位是哪一种错误,可以通过查看errno来判断.
man connect函数的结果告诉我们,分别是这两种错误号:
ETIMEDOUT
              Timeout while attempting connection.  The server may be too busy to accept new connections.  Note that  for  IP
              sockets the timeout may be very long when syncookies are enabled on the server.
ECONNREFUSED
              No-one listening on the remote address.
阅读(791) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~