已解决当连接(winsock2)套接字时,我收到错误10038

问题描述 投票:0回答:1

你好,我正在使用winsock2库编写一个带有套接字的客户端(我通常在unix中这样做,但我想在windows中尝试)。当我将套接字连接到 IP 时,出现错误 10038。我用 google 搜索 msdn,发现我正在非套接字上执行套接字操作。如果我是正确的,则意味着我没有以正确的方式创建套接字或“绑定”地址和端口到套接字。尽了最大努力,但在我的代码中找不到任何错误。 提前致谢。

这是代码:

#include <stdio.h>
#include <WinSock2.h>
#include <ws2tcpip.h>





#define okay(msg, ...) printf("[+] " msg "\n", ##__VA_ARGS__)
#define info(msg, ...) printf("[!] " msg "\n", ##__VA_ARGS__)
#define error(msg, ...) printf("[-] " msg "\n", ##__VA_ARGS__)


int main() {

    WSADATA wsa;
    SOCKET cs;
    struct sockaddr_in addr;
    char* ip = "127.0.0.1";
    int port = 4444;


    info("Initializing socket...");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        error("Couldn't initialize socket. Error -> %d", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    okay("Succesfully initialized socket.");

    info("Creating socket...");
    if (cs = socket(AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET) {
        error("Couldn't create socket. Error -> %d", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }
    okay("Succesfully created socket.");

    addr.sin_family = AF_INET;
    InetPton(AF_INET, ip, &addr.sin_addr.s_addr);
    addr.sin_port = htons(port);

    //info("IP -> %d", addr.sin_addr.s_addr);
    //info("PORT -> %d", addr.sin_port);

    info("Connecting to -> %s:%d", ip, port);
    if (connect(cs, (SOCKADDR *) &addr, sizeof(addr)) != 0) {
        error("Couldn't connect to %s:%d, error -> %d", ip, port, WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }
    okay("Connected to %s:%d", ip, port);

    char* msg = "lol";

    int response = send(cs, msg, strlen(msg), 0);

    if(response == SOCKET_ERROR){
        error("Couldn't send message to %s:%d", ip, port);
        info("Closing socket...");
        WSACleanup();
        okay("Succesfully closed socket.");
        return EXIT_FAILURE;
    }

    okay("Succesfully sent %d bytes to %s:%d", response, ip, port);

    info("Closing socket...");
    WSACleanup();
    okay("Succesfully closed socket.");

    return EXIT_SUCCESS;
}
c sockets networking tcp winsock2
1个回答
0
投票

问题不在于 connect() 调用,而在于如何存储 socket() 的返回值。

 if (cs = socket(AF_INET, SOCK_STREAM, 0) == INVALID_SOCKET)

这不会将socket()的返回值存储到cs中并与INVALID_SOCKET进行比较,而是将socket()的返回值与INVALID_SOCKET进行比较并将比较结果存储到cs中。 这意味着,成功调用时,结果为 0(因为套接字不是无效的),出错时结果为 1。这些值可能是有效的套接字,但很可能它们不是您创建的套接字。

要解决这个问题,您可以添加括号或将行分成两部分,如下所示:

// Add parentheses
if ((cs = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {
...

// Divide the operation into two lines
cs = socket(AF_INET, SOCK_STREAM, 0);
if(cs == INVALID_SOCKET) {
...
© www.soinside.com 2019 - 2024. All rights reserved.