【问题标题】:connect function Error 10047 (winsock2)连接函数错误 10047 (winsock2)
【发布时间】:2013-01-10 07:46:25
【问题描述】:

所以我从 MSDN 站点复制了一些使用基本 Windows 套接字功能的测试代码。代码如下:

#include "stdafx.h"

#ifndef UNICODE
#define UNICODE
#endif

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcipip.h>
#include <wchar.h>


int main()
{

    int iResult = 0;

    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.

    int I = sizeof(sockaddr_in);
        sockaddr_in clientService;
    clientService.sin_family = AF_INET;     
        clientService.sin_port = htons(5000);
    in_addr *s = (in_addr*)malloc(sizeof(in_addr));
    s->s_addr = inet_addr("127.0.0.1");
    clientService.sin_addr = (in_addr_t)s;

    iResult = connect(ConnectSocket, (sockaddr*)&clientService,I);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}

代码编译得很好。但是当我运行程序时,命令提示符屏幕显示以下错误消息:

连接失败并出现错误:10047

现在我知道错误 10047 表示地址结构中存在错误。我尝试使用inet_pton 但这会导致段错误(内存访问冲突),因为inet_pton 使用memcpy 函数。那么这里发生了什么? connect 功能是否执行不当?也许还有另一种方式来指定地址结构。

【问题讨论】:

  • Is the connect function improperly implemented? -- No.

标签: c++ winapi winsock2


【解决方案1】:

来自 MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625%28v=vs.85%29.aspx

sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons(27015);

似乎您的设置 .sin_addr.s_addr 的方式模棱两可。

如果结果如上,则不是问题所在,那么也许您启用了 IP6 协议但没有 IP4,这就是 AF_NET 失败并需要 AF_NET6 的原因。

【讨论】:

  • 那么如何开启IP4协议和关闭IP6协议呢?
  • @Mr X - 具体来说,这取决于您使用的操作系统。但通常设置在您的网络设置/属性中。
  • LastCoder,我用的是windows7。
【解决方案2】:

在你的情况下,问题是这里的这一行:

clientService.sin_addr = (in_addr_t)s;

您正在将一个 in_addr 指针分配给一个 in_addr 对象。像这样取消引用指针(另请注意,如果您删除强制转换,编译器会发现问题:

clientService.sin_addr = *s;

不过,LastCoder 的方法会更简单。没有理由 malloc() 一个单独的 in_addr 结构只是为了复制它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-27
    • 2013-06-08
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    相关资源
    最近更新 更多