TCP下的套接字编程

【单进程】


【多进程】

在单进程的基础上加上


【多线程】

在单进程的基础上加上线程创建如下


client.c (三个版本都不变)


当服务器先于客户端退出后,若还是用之前的那个端口再次启动时会出现bind 失败,为什么?怎么解决?

为什么?

       TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间后才能回到CLOSED状态,因为我们先Ctrl+C终止了server,所以server是主动关闭连接的一方,在TIME_WAIT期间仍然不能再次监听同样的server端口。

解决方法

       TCP没有完全断开指的是connfd(127.0.0.1 8080)没有完全断开,而我们重新监听的是listenfd(0.0.0.0 8080),虽然占用统一个端口,但是IP地址不同,connfd对应的是与某个客户端通讯的一个具体的IP地址,而listenfd对应的是wildcard address(网络通配符地址)。

可以使用setsockopt()设置socket标识符的选项SO_REUSEADDR为1,表示允许创建端口号相同但是IP地址不同的多个socket描述符。

在server代码的socket()和bind()调用之间插入一下代码。

结果如下: