设置SO_REUSEADDR后,bind失败是怎么回事

wan16897 2008-09-03 04:20:06
在win2000下可以成功绑定端口,而在Win2003\VISTA\win2008下就绑定失败,错误代码是10013

SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in lis_addr;
lis_addr.sin_addr.S_un.S_addr = INADDR_ANY;
lis_addr.sin_family = AF_INET;
lis_addr.sin_port = htons(bind_port);

bool isReuseaddr = TRUE;
int ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&isReuseaddr, 1);

ret=bind(sock, (const struct sockaddr*)&lis_addr, sizeof(sockaddr_in));
if(SOCKET_ERROR != ret)
{
sockaddr_in remote;
remote.sin_addr.S_un.S_addr = inet_addr(_pIP);
remote.sin_family = AF_INET;
remote.sin_port = htons(_port);

int len = strlen(_pBuff);
ret = sendto(sock, (const char*)_pBuff, len+1, 0, (const sockaddr*)&remote,sizeof(remote));

isReuseaddr = FALSE;

closesocket(sock);

return ret;
}
ret = WSAGetLastError();
CHAR ch[20];
sprintf(ch, "error code:%d", ret);
MessageBox(NULL, ch, "error", MB_OK);

请问在2003下如何进行端口复用???
...全文
719 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-09-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wan16897 的回复:]
简单的说是为了给进行监听的UDT打洞
[/Quote]
多重绑定并不能达到你想要的效果.
wan16897 2008-09-05
  • 打赏
  • 举报
回复
简单的说是为了给进行监听的UDT打洞
JonathanS666 2008-09-04
  • 打赏
  • 举报
回复
把setsockopt最后一个参数1改为sizeof(bool)试试,是不是你的系统字节数会不同。
僵哥 2008-09-04
  • 打赏
  • 举报
回复
对UDP协议,做重复绑定有什么意义?
乔乔公爵 2008-09-03
  • 打赏
  • 举报
回复

Requirements
Client
Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.

Server
Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.

Header
Declared in Winsock2.h.

Library
Use Ws2_32.lib.

DLL
Requires Ws2_32.dll.



这是MSDN关于setsockopt 函数的说明。
Client和Server都支持哪些操作系统,你可以在这里对比一下。

有些操作系统不支持端口重用,你没法使用这个特性,看看能不能跳出技术的范围,从项目的设计上想想办法,绕过这个特性

18,356

社区成员

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

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