连接函数错误10047 (winsock2)

connect function Error 10047 (winsock2)

本文关键字:winsock2 10047 函数 错误 连接      更新时间:2023-10-16

所以我从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: %dn", 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: %ldn", 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: %ldn", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ldn", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    wprintf(L"Connected to server.n");
    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ldn", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    WSACleanup();
    return 0;
}

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

连接失败,错误:10047

现在我知道错误10047表示地址结构中有错误。我尝试使用inet_pto n,但这会导致段错误(内存访问冲突),因为inet_pton使用memcpy函数。那么这是怎么回事呢?connect功能实现不正常?也许还有另一种方法来指定地址结构

From 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。

如果结果是以上,不是问题,那么也许你有IP6协议打开,但没有IP4,这就是为什么AF_NET失败,需要AF_NET6。

问题出在这一行:

clientService.sin_addr = (in_addr_t)s;

你将一个in_addr指针赋值给一个in_addr对象。像这样对指针解引用(同时注意,如果删除强制转换,编译器将捕获问题:

clientService.sin_addr = *s;
不过,

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