Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 连接函数错误10047(winsock2)_C++_Winapi_Winsock2 - Fatal编程技术网

C++ 连接函数错误10047(winsock2)

C++ 连接函数错误10047(winsock2),c++,winapi,winsock2,C++,Winapi,Winsock2,因此,我从使用基本windows套接字函数的MSDN站点复制了一些测试代码。代码如下: #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;

因此,我从使用基本windows套接字函数的MSDN站点复制了一些测试代码。代码如下:

#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;
}
#包括“stdafx.h”
#ifndef UNICODE
#定义UNICODE
#恩迪夫
#包括
#包括
#包括
#包括
int main()
{
int-iResult=0;
//----------------------
//初始化Winsock
WSADATA WSADATA;
iResult=WSAStartup(MAKEWORD(2,2)和wsaData);
如果(iResult!=0){
wprintf(L“WSAStartup函数失败,错误:%d\n”,iResult);
返回1;
}
//----------------------
//创建用于连接到服务器的套接字
插座连接插座;
ConnectSocket=socket(AF\u INET、SOCK\u STREAM、IPPROTO\u TCP);
if(ConnectSocket==无效的_套接字){
wprintf(L“套接字函数失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
//----------------------
//结构中的sockaddr_指定地址族,
//要连接到的服务器的IP地址和端口。
int I=sizeof(sockaddr_in);
客户端服务中的sockaddr_;
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\u错误){
wprintf(L“连接函数失败,错误:%ld\n”,WSAGetLastError());
iResult=closesocket(ConnectSocket);
if(iResult==SOCKET\u错误)
wprintf(L“closesocket函数失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
wprintf(L“已连接到服务器。\n”);
iResult=closesocket(ConnectSocket);
if(iResult==SOCKET\u错误){
wprintf(L“closesocket函数失败,错误:%ld\n”,WSAGetLastError());
WSACleanup();
返回1;
}
WSACleanup();
返回0;
}
代码编译得很好。但当我运行程序时,命令提示符屏幕显示以下错误消息:

连接失败,错误为:10047

现在我知道错误10047表示地址结构中存在错误。我尝试使用
inet\u pto
n,但由于
inet\u pton
使用
memcpy
功能,因此导致了段错误(内存访问冲突)。这是怎么回事?
connect
功能是否执行不当?也许还有另一种方法可以指定地址结构。

来自MSDN:

似乎是你的设置。sin_addr.s_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结构只是为了复制它。

连接功能是否执行不当?
--。那么如何打开IP4协议并禁用IP6协议呢?@Mr X-具体来说,这取决于您使用的操作系统。但通常情况下,这些设置在您的网络设置/属性中。LastCoder,我使用的是win道斯7。
clientService.sin_addr = *s;