已经connect的SOCKET,如何disconnect(不要重新CreateSocket)

proad 2009-07-21 04:39:02
TCP客户端:
已经连接到服务器,被服务端强制断开,此时需要重新连接,
如果直接Connect,会报错说连接已经建立,
已知一种不太好的办法是CloseSocket/CreateSocket/Connect,太麻烦,
是否有简便的方法,直接disconnect/connect?

此处的disconnect如何实现(不要重新CreateSocket)?
...全文
给本帖投票
2045 28 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztq56 2011-02-22
  • 打赏
  • 举报
回复
杯具啊,
socket怎么想的?都没有disconnect()函数……
sevencat 2009-08-31
  • 打赏
  • 举报
回复
我一直用你认为不太好的办法。
feiyangdn 2009-08-31
  • 打赏
  • 举报
回复
说的非常有理,有些东西想得太多,自找麻烦,不推荐使用
客户端收到CLOSE消息后,客户端已经把SOCKET毙掉了,要重连接,再建立一下吧。

[Quote=引用 25 楼 dinona 的回复:]
如果楼主是从效率上考虑重用的话我觉得就没必要了
对于客户端来说你争取这点效率对用户是一点感知
都没有的,关闭重新申请吧~~
我记得就算是服务器端也不会贸然考虑套接字的重用的
[/Quote]
dinona 2009-08-28
  • 打赏
  • 举报
回复
如果楼主是从效率上考虑重用的话我觉得就没必要了
对于客户端来说你争取这点效率对用户是一点感知
都没有的,关闭重新申请吧~~
我记得就算是服务器端也不会贸然考虑套接字的重用的
「已注销」 2009-08-28
  • 打赏
  • 举报
回复
你能收到服务器断开你了吗?能的话就好办了啊,CLOSESOCKET,然后重新连接

再说了已经CREATE得SOCKET不关掉也不好啊
UndefinedCoder 2009-08-24
  • 打赏
  • 举报
回复
DisconnectEx和ConnectEx
vieri122 2009-08-24
  • 打赏
  • 举报
回复
The DisconnectEx function closes a connection on a socket, and allows the socket handle to be reused.

Note This function is a Microsoft-specific extension to the Windows Sockets specification.



BOOL DisconnectEx(
__in SOCKET hSocket,
__in LPOVERLAPPED lpOverlapped,
__in DWORD dwFlags,
__in DWORD reserved
);
zhaohongbo83 2009-08-23
  • 打赏
  • 举报
回复
就的 先close 然后create 最后connection了
没有更好的办法吧
月竹影 2009-08-23
  • 打赏
  • 举报
回复
对了,在MSDN里面的函数声明是
BOOL DisconnectEx(
SOCKET hSocket,
LPOVERLAPPED lpOverlapped,
DWORD dwFlags,
DWORD reserved
);
详细的说明你自己可以看一下
月竹影 2009-08-23
  • 打赏
  • 举报
回复
有套接字重用的,函数是DisconnectEx,但是这个函数是扩展函数必须用DLL里面导出来,才可以使用

LPFN_DISCONNECTEX m_lpfnDisconnectEx;
GUID guid3 = WSAID_DISCONNECTEX;
//guid = WSAID_DISCONNECTEX;
if(WSAIoctl(m_sock,SIO_GET_EXTENSION_FUNCTION_POINTER,
&guid3,sizeof(guid3),&m_lpfnDisconnectEx,sizeof(m_lpfnDisconnectEx),&dwBytes,NULL,NULL)==SOCKET_ERROR)
{
closesocket(m_sock);
m_sock= INVALID_SOCKET;
return FALSE;
}
上面的m_sock是已经创建好的SOCKET,



应该能解决你的问题,你可以尝试下看看,是否能成功
伏地码 2009-08-22
  • 打赏
  • 举报
回复
1)楼主目的是想TCP连接不被服务器断掉,如果是,建议设置心跳,间隔小于3分钟即可。

2)如果目的是想让本端提高建链性能。
建议创建多个保留socket,如果一个被中断,就启用其他的。直接connect。当然得预留不同端口。
proad 2009-08-03
  • 打赏
  • 举报
回复
up
心留 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fangle6688 的回复:]
必须close、create之后才能connect,没有捷径
[/Quote]

我也这样认为
tuzi0203 2009-07-24
  • 打赏
  • 举报
回复
好像是shutdown,然后closesocket
zouhj2009 2009-07-24
  • 打赏
  • 举报
回复
学习了
fangle6688 2009-07-24
  • 打赏
  • 举报
回复
必须close、create之后才能connect,没有捷径
dong364 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 proad 的回复:]
引用 5 楼 dong364 的回复:
有个问题想问lz:为什么会被服务器强制断开呢?


这受限于服务器(是其他厂商提供的)的实现吧,我实际遇到的情况:
TCP连接到服务器后,可以不限次数的请求并接受响应,但该连接一旦超过3分钟,就会被服务器中断,它是为了避免负荷太大吧。此时我需要再次连接。
[/Quote]

我想服务器不是因为负荷大,而是剔除那些恶意链接,就是只连接而不发数据,由此而带来的额外消耗
proad 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dong364 的回复:]
我想服务器不是因为负荷大,而是剔除那些恶意链接,就是只连接而不发数据,由此而带来的额外消耗
[/Quote]

当然,这都是服务器避免恶意连接,以达到不必要的负荷过大,它的判断方法很多我们无法预料也无法确切的知道,
总之,会导致服务器强制中断客户连接,此时客户端需要重新连接,就有了我说的问题。
proad 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 dong364 的回复:]
有个问题想问lz:为什么会被服务器强制断开呢?
[/Quote]

这受限于服务器(是其他厂商提供的)的实现吧,我实际遇到的情况:
TCP连接到服务器后,可以不限次数的请求并接受响应,但该连接一旦超过3分钟,就会被服务器中断,它是为了避免负荷太大吧。此时我需要再次连接。
proad 2009-07-22
  • 打赏
  • 举报
回复
up
加载更多回复(8)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部