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
- 调用close之后,无需再在epoll里对fd作操作
- 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) 编辑 收藏 举报