VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1259|回复: 7

调用bind()时报错:通常每个套接字地址(...)只允许使用一次,怎么解决?

[复制链接]

2

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-21 17:00:01 | 显示全部楼层 |阅读模式
程序的大概流程是这样的:

1)用socket()创建一个socket对象
2) 用bind()把socket对象绑定到指定地址及端口
3)listen()开始监听
4)关闭程序时closesocket()

正常运行时没有问题,但如果程序在关闭前因非法操作崩溃退出了,再启动程序时,运行到bind()时就会报错:“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”,错误号是10048
而且这时只能重注销操作系统再启动,才能不再报这个错
我想知道当我判断到这个错误号时,socket库函数中有没有可以释放原来已被绑定的端口的方法?各位高手指定一二,谢谢了!
回复

使用道具 举报

0

主题

10

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-6-30 13:15:01 | 显示全部楼层
试试WSACleanup
回复

使用道具 举报

0

主题

10

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-1 06:00:01 | 显示全部楼层
或用setsockopt设置SO_REUSEADDR
回复

使用道具 举报

0

主题

24

帖子

19.00

积分

新手上路

Rank: 1

积分
19.00
发表于 2020-7-1 10:15:01 | 显示全部楼层
等30秒左右就可以。等TCP的变成CLOSED状态。 看过TCP的状态变迁图就明白了。
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-7-4 09:45:01 | 显示全部楼层
地址复用 SO_REUSEADDR
回复

使用道具 举报

0

主题

59

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-7-6 14:15:02 | 显示全部楼层
土方法:把网络禁用再启用
回复

使用道具 举报

2

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-26 06:30:01 | 显示全部楼层
WSACleanup我试了不行
地址复用 SO_REUSEADDR,我本来想试的,可是因为我程序是PB开发的,不知道怎么调用这个库函数(因为参数类型问题,总是调用不成功),估计这种方法是可以的
土方法:把网络禁用再启用--这个不太适用吧
等30秒这种方法,好像不行吧,我这里一出这个问题, 即使等再长时间,也要重启了才行
=================================================================================
我最后还是在程序系统错误事件中调用closesock()才行
回复

使用道具 举报

2

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-7-26 07:45:01 | 显示全部楼层
谢谢大家的关注。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表