首页 > 代码库 > UDP 第四章基本套接字编程

UDP 第四章基本套接字编程

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