c++ - 尝试打开 TCP 套接字时出错 - C++

标签 c++ visual-studio tcp

enter image description here

我正在尝试构建一个 block ,作为服务器和客户端通过 TCP 连接发送和接收数据(2 台不同计算机中的 2 个重复版本)。

这就是我所做的,我正在尝试使用 Windows 命令行“netstat -ab”进行测试以尝试找到 tcp 连接,但我找不到它。

除了给定的错误,我还做错了什么?

bool IPTunnel::runBlock(void) {
    int ready =
        inputSignals[0]->ready(); // int ready2 = inputTCPConnetion[0]->ready();

    // server
    SOCKET sockfd, newsockfd;
    int portno;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    SOCKET n;

    // create a socket(int domain, int type, int protocol)
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0) printf("\n ERROR opening socket");


    // bzero((char *)&serv_addr, sizeof(serv_addr));

    portno = 5500;


    serv_addr.sin_family = AF_INET;
    char ipad[10] = "127.0.0.1";
    serv_addr.sin_addr.s_addr = *ipad; // INADDR_ANY;
    serv_addr.sin_port = htons(portno);



    // if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    auto sd = bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    // if (sd < 0)
    //  printf("\n ERROR on binding");


    listen(sockfd, 5);

    clilen = sizeof(cli_addr);

    newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen);
    if(newsockfd < 0) printf("ERROR on accept");

    printf("server: got connection from %s port %d\n",
           inet_ntop(serv_addr.sin_family, &ipad, buffer, clilen),
           ntohs(cli_addr.sin_port));

    send(newsockfd, "Hello, world!\n", 13, 0);

    // bzero(buffer, 256);

    n = _read(newsockfd, buffer, 255);
    if(n < 0) printf("ERROR reading from socket");
    printf("Here is the message: %s\n", buffer);
    while(true) {
    }
    // close(newsockfd);
    // close(sockfd);
    return 0;
}

这是给出的错误:ip_tunnel.exe 中 0x00007FFE5031B7EC (ucrtbased.dll) 处未处理的异常:将无效参数传递给认为无效参数致命的函数。

在 _read 函数中...

最佳答案

嗯,这行肯定是错的:

serv_addr.sin_addr.s_addr = *ipad; //INADDR_ANY;

如果你想在环回设备上接收传入的 TCP 连接,你应该做更多类似这样的事情:

serv_addr.sin_addr.s_addr = inet_aton("127.0.0.1");

(或者如果您希望从任何连接的网络设备接收它们,请改为指定 INADDR_ANY)

此外,请确保您在程序开始时调用了 WSAStartup(),否则 Windows 套接字将无法正常工作。

最后一个吹毛求疵:

while(true){}

不是暂停程序执行的好方法。一方面,它通常会以 100% 使用率旋转 CPU,这是非常低效的;另一方面,它会根据 C++ 标准调用未定义的行为。

获得这种行为的更好方法是:

while(true) {Sleep(1000);}

这部分也是错误的/奇怪的:

SOCKET n;
[...]
n = _read(newsockfd, buffer, 255);

...因为 _read 不返回 SOCKET,它返回 int。我认为您打算改为声明 int n;

最后一个潜在问题:如果您对 bzero(buffer, 256); 的调用被注释掉,那么 buffer 很可能在之后不包含零字节_read() 调用返回,在这种情况下,您的 printf("Here is the message: %s\n", buffer); 之后的调用可以读取到最后buffer 数组并进入其他内存的狂野蓝色,可能导致崩溃(或至少导致打印大量垃圾字节)。解决方法是确保 buffer 数组在 _read() 调用放置在那里的有效字节末尾包含一个 0/​​NUL 字节。

关于c++ - 尝试打开 TCP 套接字时出错 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56195456/

相关文章:

c++ - 我想删除背景(就像黑环)

c++ - + 字符串和整数运算符

c++ - 了解 C++ constexpr 性能

c++ - Visual Studio 无故重新编译在两个解决方案之间共享的项目

c# - 解决方案范围 app.config/web.config?

java - Netty 中用于服务器端计划任务/事件的最佳方法

wcf - 奇怪的 WCF net.tcp 异常

c - 如何检查 TCP 层上的套接字是否处于事件状态?

java - CallStaticBooleanMethodV 的返回类型与 Java 方法签名不匹配 - 从 C/C++ 调用 Java 方法

c++ - Qt 程序在另一台计算机上执行时崩溃