我目前正在开发一个项目,需要在 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。
如果需要任何其他信息,请告诉我。谢谢!
ESP IDF 中的错误代码 127 似乎是 EISCONN,“套接字已连接”。
您的代码在循环中运行。成功连接到主机后,循环立即再次尝试。因此出现错误。