connect():不需要bind,内核会自动加源地址和随机端口,connect会发送3次握手,只有在成功连接或者出错的情况才返回。
出错的情况有3种:1.收不到syn确认包,会超时重发,总共75秒后time out
2.收到不可达包,会重发,等一段时间后no route to host
3.服务器没有监听,服务器会返回rst包,connection refuesd
注:每次connect失败后必须关闭套接口 ?connect失败后,状态未知?不懂
bind,客服端会自动选择端口bind,服务器若直接listen,也会bind,但是端口随机,这对服务器是不正确的,所以服务器一般需要先bind,再listen
对于IP,客服端的发送数据会自动选源IP,服务器若bind指定IP,则表明只能监听指定IP,所以服务器一般addr_any
listen监听,会创建2个队列,listen中的参数backlog指定了某端口上这两个队列之和的大小
当两个队列满时,syn到来时,忽略syn,不发送任何包给客户端,通过超时重发来期待下一次队列不满
accept从已经完成的队列上取连接,若队列空,阻塞
并发服务器框架
listenFd = socket;
bind;
listen;
for()
{
connectFd = accept;
if((pid = fork()) == 0) //fork后,connectFd计数为2
{
closed(listenFd);
//fuwu
closed(connectFd); //计数减1,当真正为0是,才closed断开连接
}
closed(connectFd);//计数减1
shutdown可以直接端口连接,不要计数减为0
原文地址:http://www.cnblogs.com/jsy306/p/3778866.html