导航

tcp socket通信 Round 2

  • server端未创建socket;server端创建socket;server创建socket并bind:此时client端尝试connect不会阻塞(未作设置),但errno为111,即

#define ECONNREFUSED 111 /* Connection refused */

  • server端创建socket,调用bind,listen,未调用accept,此时client尝试connect不会阻塞,errno为0即正常
  • 使用epoll时,如果先调用close,再对fd做操作,如DEL,epoll_ctl报错
    • 调用close之后,无需再在epoll里对fd作操作
      • Linux/UNIX系统编程手册(下):p1120 一旦所有指向打开的文件描述符都被关闭后,这个打开的文件描述符将从epoll兴趣列表中移除。  
    • 先epoll_ctl删除fd,再调用close
  • setsocketopt函数使用SO_REUSEADDR仍报错地址已在使用(centos),改为使用SO_REUSEPORT工作正常
  • centos上绑定地址后,要开端口,否则客户端报错113,即

#define EHOSTUNREACH 113 /* No route to host */

开端口命令如下

iptables -I INPUT -p tcp --dport 1234 -j ACCEPT
  • client端调用close后,不能再对fd调用connect。需再次调用socket,对此时的fd调用connect。   
  • 遇到客户端connect成功,但服务器端epoll无通知问题,最后发现时因为服务器端该端口已被其他程序使用:之后bind端口只使用10000以下
    • 还有一点就是,另一个程序设置的是该端口可重用,即SO_REUSEPORT
    • 偷师
      • cat /proc/`进程号`/status
      • netstat -anopt | grep `bind的端口`
        • 查看绑定的端口的状态  
      • iptables -L INPUT -nv
        • 看监听端口的状态
      • telnet `使用的IP` `使用的端口`
        • 再次建立TCP连接
  • 关于服务器端调用完listen,客户端调用connect可以成功返回,而无需等到服务器端accept之后
    • 由listen接受连接,并加入等待队列,即accept之前连接已建立成功,accept是从建立了连接的队列中取出第一个,并为之分配一个socket
    • connect触发连接的三次握手,若握手成功connect就返回成功
    • https://www.cctry.com/thread-39274-1-1.html     

        

posted on 2021-05-29 13:54  toughcactus  阅读(75)  评论(0编辑  收藏  举报