主动断开socket链接_socket的server端怎么主动断开已连接好的链接呀??

在TCP协议中,服务器如何主动断开已建立的连接是一个常见问题。使用close()函数并不能立即断开连接,可能会导致TIME_WAIT状态。讨论了shutdown()和setsockopt()函数的作用,以及TCP_NODELAY选项的影响。在某些情况下,可以设置SO_REUSEADDR选项来允许快速重用端口。然而,彻底解决TIME_WAIT问题并不简单,通常需要等待一段时间确保TCP四次挥手完成。

你把代码贴出来看看

不会吧! 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.

来人哪

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值