VS2017 Win7 x64环境下SO_REUSEADDR与SO_EXCLUSIVEADDRUSE理解困惑
关于SO_REUSEADDR和SO_EXCLUSIVEADDRUSE的困惑(VS2017+Win7 x64环境)
我现在在VS2017、Win7 x64的环境下做套接字开发,对SO_REUSEADDR和SO_EXCLUSIVEADDRUSE这两个套接字选项的作用一直搞不清楚。虽然已经查过MSDN的文档,但还是没弄明白它们的实际行为逻辑。
我做了个测试:在两个独立的进程里运行一段简单的套接字代码,发现只有当两个套接字都启用SO_REUSEADDR选项时,第二个进程的bind调用才能成功;如果其中任意一个套接字没开这个选项,第二个进程的bind就直接失败了。
下面是我用到的代码片段(简化版):
#define PORT 5150 SOCKET sockListen; if ((sockListen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET) { // 错误处理 } // 设置套接字选项(这里会切换是否启用SO_REUSEADDR) BOOL optVal = TRUE; if (setsockopt(sockListen, SOL_SOCKET, SO_REUSEADDR, (char*)&optVal, sizeof(optVal)) == SOCKET_ERROR) { // 错误处理 } sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = htonl(INADDR_ANY); service.sin_port = htons(PORT); if (bind(sockListen, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) { // 错误处理 }
有没有大佬能帮我解释清楚这两个选项在Win7下的实际作用,以及为什么会出现我测试里的这种情况?
内容的提问来源于stack exchange,提问作者Wad
相关产品推荐
相关产品推荐

