尝试打开TCP套接字时收到错误消息-C ++

时间:2019-05-18 02:16:57

标签: c++ visual-studio tcp

enter image description here

我正在尝试构建一个充当服务器和客户端的块,以通过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函数中...

1 个答案:

答案 0 :(得分:2)

好吧,这一行肯定是错误的:

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字节。