Linux 套接字 - 服务器接受客户端,但客户端失败并出现 errno 127

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

问题

我目前正在开发一个项目,需要在 ESP32 客户端和笔记本电脑上运行的服务器之间建立 TCP 连接。服务器端似乎正在工作,服务器侦听连接并等待客户端套接字接受。当我启动客户端 ESP32 时,服务器打印出一条消息“SOCKET ACCEPTED”,但客户端打印出“UNABLE TO CONNECT TO SERVER: ERRNO 127”。我在网上看到 errno 127 意味着密钥已过期,但是我无法找到解决此问题的方法。下面是我的服务器和客户端的代码,任何帮助将不胜感激。

服务器代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <limits.h>

//write an error function
void error (const char *msg){
    perror(msg);
    exit(EXIT_FAILURE);
}

int main (int argc, char *argv[]){
    //function variables
    int sockFD = 0;
    int PORT = 0;
    const int MAX_CONNECTIONS;
    int n = 0;
    char buffer[255] = {' '};
    struct sockaddr_in serverAddr;
    struct sockaddr_in clientAddr;
    socklen_t cliLen;
    
    //the user should enter a port number as a command line argument
    if (argc < 2){
        printf("***PORT NUMBER NOT PROVIDED***\n");
        exit(EXIT_FAILURE);
    }

    //create the socket
    sockFD = socket(AF_INET, SOCK_STREAM, 0);
    if (sockFD < 0){
        error("***COULD NOT OPEN SOCKET***\n");
    }
    else{
        printf("***SOCKET OPENED***\n");
    }
    
    //clear the server address
    memset(&serverAddr, 0, sizeof(serverAddr));

    //get the port number
    PORT = atoi(argv[1]);

    //configure the socket
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(PORT);
     
    
    //bind the port to the address
    if (bind(sockFD, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0){
        error("***COULD NOT BIND TO PORT***\n");
    }
    else{
        printf("***PORT BINDED***\n");
    }
  
    char hostname[HOST_NAME_MAX + 1];
    hostname[1023] = 0;
    gethostname(hostname, sizeof(hostname));
    printf("***HOSTNAME %s ***\n", hostname);
 
    //listen for incoming connections
    printf("***LISTENING...***\n");
    listen(sockFD, MAX_CONNECTIONS);
    cliLen = sizeof(clientAddr);
    
    //accept the connections
    sockFD = accept(sockFD, (struct sockaddr *) &clientAddr, &cliLen);
    if (sockFD < 0){
        error("***COULD NOT ACCEPT THE SOCKET***\n");
    }
    else{
        printf("***SOCKET ACCEPTED***\n");
    }
   
   
    while(true){
        //clear the buffer to ensure there is no data left over
        memset(&buffer, 0, sizeof(buffer));

        //read data from the client
        n = read(sockFD, buffer, sizeof(buffer));
        if (n < 0){
            error("***COULD NOT READ FROM THE CLIENT***\n");
        }
        printf("CLIENT: %s\n", buffer);

        //clear the buffer again
        memset(&buffer, 0, sizeof(buffer));

        //read input from the server (essentially a safer version of scanf)
        fgets(buffer, sizeof(buffer), stdin);
        if (strcmp(buffer,  "QUIT") == 0){
            break;
        }
        
        //send the data to the client
        n = write(sockFD, buffer, strlen(buffer));
        if (n < 0){
            error("***COULD NOT WRITE TO THE CLIENT***\n");
        }

        if (strcmp("QUIT", buffer) == 0){
            break;
        }
        shutdown(sockFD, 0);
        close(sockFD);
    }

    exit(EXIT_SUCCESS);
}

打印出“SOCKET ACCEPTED”并等待客户端

客户端代码

//connect to tcp server
int tcpConnect(void){
    //function variables
    int sockFD = socket(AF_INET, SOCK_STREAM, 0);
    int err = 0;
    const int PORT = 8080;
    //if I put in the domain name of my server, the client prints out 
    // "COULD NOT FIND HOST"
    const char *HOSTNAME = "ip.address.of.my.server";
    const char *TAG = "TCP CONNECT";
    struct hostent *host;
    struct sockaddr_in serverAddress;
    while(true){
        //create a socket
        if (sockFD < 0){
            ESP_LOGE(TAG, "***UNABLE TO CREATE A SOCKET: %d***\n", errno);
            return TCP_FAILURE;
        }
        //setup host parameters
        host = gethostbyname(HOSTNAME);
        if (host == NULL){
            ESP_LOGE(TAG, "***UNABLE TO FIND HOSTNAME***\n");
            return TCP_FAILURE;
        }
        
        //config the host parameter
        serverAddress.sin_family = AF_INET;
        serverAddress.sin_port = htons(PORT);
        serverAddress.sin_addr.s_addr = *(in_addr_t *) host -> h_addr;

        //connect to the server
        err = connect(sockFD, (struct sockaddr *) &serverAddress, sizeof(serverAddress));
        if (err != 0){
            ESP_LOGE(TAG, "***UNABLE TO CONNECT TO SERVER: %d***\n", errno);
            return TCP_FAILURE;
        }
        else{
            ESP_LOGI(TAG, "***CONNECTED TO THE SERVER***\n");
        }

    }
    shutdown(sockFD, 0);
    close(sockFD);
    return TCP_SUCCESS;
}

打印“无法连接到服务器:ERRNO 127”并返回 TCP_FAILURE。

编辑当我尝试连接到google.com时,客户端打印出“无法连接到服务器:ERRNO 113”并返回TCP_FAILURE。

如果需要任何其他信息,请告诉我。谢谢!

c sockets tcp esp32 esp-idf
1个回答
0
投票

ESP IDF 中的错误代码 127 似乎是 EISCONN,“套接字已连接”。

您的代码在循环中运行。成功连接到主机后,循环立即再次尝试。因此出现错误。

© www.soinside.com 2019 - 2024. All rights reserved.