首页
学习
活动
专区
圈层
工具
发布

TCP优化
EN

Stack Overflow用户
提问于 2013-08-07 12:20:12
回答 1查看 638关注 0票数 2

我使用SOL_SOCKET协议编写了一段代码,但错误为10043 (套接字中的错误)。

守则如下:

代码语言:javascript
复制
#include <QCoreApplication>
#include<QDebug>
//#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

/****************************************/
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
/****************************************/

#define DEFAULT_BUFLEN 512

int recvbuflen = DEFAULT_BUFLEN;
char recvbuf[DEFAULT_BUFLEN];

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    WSADATA wsaData;
    int iResult;
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    ZeroMemory( &hints, sizeof(hints) );
    //hints.ai_family = AF_UNSPEC;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = SOL_SOCKET;
    //hints.ai_protocol = IPPROTO_TCP;

#define DEFAULT_PORT "10990"

// Resolve the server address and port
iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
if (iResult != 0) {
    printf("getaddrinfo failed: %d\n", iResult);
    WSACleanup();
    return 1;
}

SOCKET ConnectSocket = INVALID_SOCKET;

// Attempt to connect to the first address returned by
// the call to getaddrinfo
ptr=result;

// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype,
    ptr->ai_protocol);

if (ConnectSocket == INVALID_SOCKET) {
    printf("Error at socket(): %ld\n", WSAGetLastError());
    freeaddrinfo(result);
    WSACleanup();
    return 1;
}

    int rcvbuf = 8192;  /* recv buffer size */
    int z = setsockopt(ConnectSocket,SOL_SOCKET,SO_RCVBUF,
    (char*)&rcvbuf,sizeof(rcvbuf));

    do {
            iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
            if (iResult > 0)
            printf("Bytes received: %d\n", iResult);
            else if (iResult == 0)
            printf("Connection closed\n");
            else
            printf("recv failed: %d\n", WSAGetLastError());
       } while (iResult > 0);

    return a.exec();
}

当我运行时,它显示:

代码语言:javascript
复制
Error in socket:10043

我搜索了它,发现错误是由于套接字类型协议错误,我试图找到正确的协议和套接字类型匹配,但找不到,我尝试了每一个可能的套接字选项和协议匹配。有谁面临同样的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-07 12:24:27

您在ai_protocol字段中放置了错误的值。它需要是IPPROTO_常量之一(例如IPPROTO_TCPIPPROTO_ICMP)。

SOL_SOCKET用于设置套接字选项 (就像稍后代码中所做的那样)。

通常不应将该成员设置为零。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18103218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档