你把代码贴出来看看
不会吧! close()以后就断开了啊。
我的程序是一个多线程的 主线程在socket1=accept()返回后就会创建一线程去完成socket通讯,在socket1的客户端没有主动断的情况下,server端的线程会阻塞在recv(socket1,...)处,这个时候我close(socket1),close返回成功,但是ps -ef 后那个链接还在,端口还未释放
对不起不是ps -ef 是 netstat -an
用shutdown()函数可以主动关闭连接
先shutdown再closesocket
还是不行呀
等一段时间就断了
需要等一段时间才断
你可以用select设置中断时间.
对socket使用setsockopt函数,使端口地址重用。
UP
哈哈
setsockopt 一般来说是一定要用的,
close()
也是可以关闭连接的呀,可能你大代码写的有问题
close()这个函数只是向客户端发送一个FIN字节
但如果服务端接收不到客户端发来的FIN字节时
整个TCP连接不能正常中止
另外当TCP连接正常中止后
服务端将处于TIME_WAIT状态(执行主动关闭的那一端)
这个状态的时间为2MSL(这个时间由于系统不一样大概在1到4分钟之间)
保留这个时间是为了保证TCP终止的四次会话正常完成
忘了说清楚了
最后这个状态是为了等让服务器的最后一个ACK包能到达客户端
那么有没有方法可以在使用close函数后,使的连接直接断开?就像在windows中使用closesocket一样。
如果直接断开也不管可靠性,那用UDP吧
TCP的建立的三次握手和关闭的四次握手都要保证可靠性
shutdown函数也只能保证激发一个FIN包,而不检查描述字的计数
应该不能从根本上保证直接断开
可否使用setsockopt函数设置TCP_NODELAY的值,来改变这个现象?
UP
基本上不能
TCP_NODELAY选项是为了禁止Nagle算法
这个算法的目的是为了减少WAN上小分组的数目的
也就是说ACK或FIN被认为是一个小的分组
这不是解决这个问题的办法
我认为出现TIME_WAIT这应该是一个正常的情况
没有必要管它
因为基本上不会影响你到的连接数目
怎么能彻底解决这个问题呢
...
setsockopt()和getsockopt()系统调用
Linux所提供的socket库含有一个错误(bug).此错误表现为你不能为一个套接字重新启
用同一个端口号,即使在你正常关闭该套接字以后.例如,比方说,你编写一个服务器在一个
套接字上等待的程序.服务器打开套接字并在其上侦听是没有问题的.无论如何,总有一些原
因(不管是正常还是非正常的结束程序)使你的程序需要重新启动.然而重启动后你就不能把
它绑定在原来那个端口上了.从bind()系统调用返回的错误代码总是报告说你试图连接的端
口已经被别的进程所绑定.
问题就是Linux内核在一个绑定套接字的进程结束后从不把端口标记为未用.在大多数UN
IX系统中,端口可以被一个进程重复使用,甚至可以被其它进程使用.
在Linux中绕开这个问题的办法是,但套接字已经打开但尚未有连接的时候用setsockopt
()系统调用在其上设定选项(options).setsockopt()调用设置选项而getsockopt()从给定
的套接字取得选项.
这里是这些调用的语法:
#include
#include
int getsockopt(int sockfd, int level, int name
, char *value, int *optlen)
int setsockopt(int sockfd, int level, int name
, char *value, int *optlen)
sockfd必须是一个已打开的套接字.level是函数所使用的协议标准(protocol level)(T
CP/IP协议使用IPPROTO_TCP,套接字标准的选项实用SOL_SOCKET),选项的名称(name)在套接
字说明书中(man page)有详细说明.*value指向为getsockopt()函数所获取的值或setsocko
pt()函数所设置的值的地址.optlen指针指向一个整数,该整数包含参数以字节计算的长度.
其值被getsockopt()设置且其值必须被程序员设定当使用一个经由setsockopt().
选项的所有细节可以在使用手册中setsockopt的第二节(setsockopt(2))找到.
现在我们再回到Linux的错误上来.当你打开一个套接字时必须同时用下面的代码段来调
用setsockopt()函数:
#ifdef LINUX
opt = 1; len = sizeof(opt);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt
,&len);
#endif
只有当你想让程序不光是在Linux系统下使用时,#ifdef和#endif描述才是必须的.有些U
NIX系统可能不支持或不需要SO_REUSEADDR标志.
...
from 网络程序设计 Sockets
解决办法呢
上面的办法不能解决吧
jixu ding,zhi dao you ren huida.
来人哪
在TCP协议中,服务器如何主动断开已建立的连接是一个常见问题。使用close()函数并不能立即断开连接,可能会导致TIME_WAIT状态。讨论了shutdown()和setsockopt()函数的作用,以及TCP_NODELAY选项的影响。在某些情况下,可以设置SO_REUSEADDR选项来允许快速重用端口。然而,彻底解决TIME_WAIT问题并不简单,通常需要等待一段时间确保TCP四次挥手完成。
1081

被折叠的 条评论
为什么被折叠?



