Socket bind 10047 错误

hili210 2016-05-09 04:42:12
编译工具:VS2015

执行后返回Socket bind error code: 10047
错误码查询给出的提示是使用了与请求的协议不兼容的地址(下面第二个函数参数我传递的是:"127.0.0.1", 9995)
试了很多种方法但还是不行,求解,谢谢

Winsock初始化:

// 初始化Winsock库
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2, 2/*0*/);
if (WSAStartup(sockVersion, &wsaData) != 0) {
return SOCK_ERROR_WSAStartup;
}


Socket初始化与绑定:

int create_tcp_server(const char* szIP, int nPort) {
if (nServerStatus != TCP_STATUS_OFF) {
return SOCK_SERVER_NOT_CLOSE;
}
if (szIP == NULL) {
return SOCK_ERROR_IP_NULL;
}
if (nPort < 0 || nPort > 65535) {
return SOCK_ERROR_PORT_OF_RANGE;
}

// 初始化TCP
int nError = init_tcp_socket();
if (nError != SOCK_SUCCESS) {
return nError;
}

if (sockServer != INVALID_SOCKET) {
closesocket(sockServer);
sockServer = INVALID_SOCKET;
}

// 创建套接字
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockServer == INVALID_SOCKET) {
return SOCK_SERVER_SOCKET_FAIL;
}

//绑定IP和端口
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(nPort);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (strcmp(szIP, "") != 0) {
sin.sin_addr.S_un.S_addr = inet_pton(sin.sin_family, szIP, (void *)&sin);
}
else {
sin.sin_addr.S_un.S_addr = INADDR_ANY;
}

if (bind(sockServer, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {
printf("\nSocket bind error code: %d\n", WSAGetLastError());
return SOCK_SERVER_BIND_FAIL;
}

return SOCK_SUCCESS;
}


...全文
767 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hili210 2016-05-09
  • 打赏
  • 举报
回复
大致确定是 sin.sin_addr.S_un.S_addr = inet_pton(sin.sin_family, szIP, (void *)&sin); 这句有问题,因为改成了被编译器弃用的inet_addr:sin.sin_addr.S_un.S_addr = inet_addr(szIP);就可以 其实这个if判断是根据传递过来的IP判断,如果填了IP,则进行转换成这个IP,如果是没有填,则用INADDR_ANY 如果直接用INADDR_ANY的话相当于就开启服务就不需要传递IP了吧
Sping 2016-05-09
  • 打赏
  • 举报
回复
svr直接写 sin.sin_addr.S_un.S_addr = INADDR_ANY; 就没了不是么? 这段删了不就行了。我还没搞懂你写这段是什么意思呢。。。

if (strcmp(szIP, "") != 0) {
        sin.sin_addr.S_un.S_addr = inet_pton(sin.sin_family, szIP, (void *)&sin);
    }
    else {
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
    }
hili210 2016-05-09
  • 打赏
  • 举报
回复
如果执行sin.sin_addr.S_un.S_addr = INADDR_ANY;是可以的 但是执行了inet_pton这段后就会bind失败

18,356

社区成员

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

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