gpt4 book ai didi

sockets - 带有 BSD 套接字的错误文件描述符

转载 作者:行者123 更新时间:2023-12-03 11:52:23 25 4
gpt4 key购买 nike

当我尝试将数据从我的 tcp 服务器发送到我的 tcp 客户端时,我不断收到“错误的文件描述符”错误。这在套接字方面意味着什么?我在这方面已经有一段时间了,我看不出我的代码有什么问题。它与我两天前使用的代码基本相同,并且该代码运行良好。我希望有人能告诉我在尝试通过套接字发送时出现错误文件描述符的常见原因是什么,以及如何检查/修复它们。任何帮助表示赞赏。如果有帮助,我将在下面发布一些代码。

/*Waits to connect a client. Returns true if successful*/
bool TcpServer::launchServer() {
int status;

struct addrinfo hints;
struct addrinfo *servinfo; //will point to the results

//store the connecting address and size
struct sockaddr_storage their_addr;
socklen_t their_addr_size;


memset(&hints, 0, sizeof hints); //make sure the struct is empty
hints.ai_family = AF_INET; //ipv4
hints.ai_socktype = SOCK_STREAM; //tcp

//get server info, put into servinfo
if ((status = getaddrinfo("192.168.2.3", port, &hints, &servinfo)) != 0) {
printf("\ngetaddrinfo error: %m", errno);
return false;
}

//make socket
fd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if (fd < 0) {
printf("\nserver socket failure %m", errno);
return false;
}

//allow reuse of port
int yes=1;
if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char*) &yes,sizeof(int)) == -1) {
perror("setsockopt");
return false;
}

//bind
if(bind (fd, servinfo->ai_addr, servinfo->ai_addrlen) < 0) {
printf("\nBind error %m", errno);
return false;
}

//free up space
freeaddrinfo(servinfo);

//listen
if(listen(fd, 5) < 0) {
printf("\nListen error %m", errno);
return false;
}
their_addr_size = sizeof(their_addr);


//accept
comm_fd = accept(fd, (struct sockaddr*)&their_addr, &their_addr_size);
if( comm_fd < 0) {
printf("\nAccept error %m", errno);
return false;
}

return true;
} //END LAUNCHSERVER






void TcpServer::communicate() {


fd_set read_flags,write_flags; // the flag sets to be used
struct timeval waitd = {10, 0}; // the max wait time for an event
int sel; // holds return value for select();
int numRead; //holds return value for read()
int numSent; //holds return value for send()
char in[255]; //in buffer
char out[255]; //out buffer

//clear buffersz
memset(&in, 0, 255);
memset(&out, 0, 255);


while(!done) {
FD_ZERO(&read_flags);
FD_ZERO(&write_flags);
FD_SET(comm_fd, &read_flags);
FD_SET(comm_fd, &write_flags);
FD_SET(STDIN_FILENO, &read_flags);
FD_SET(STDIN_FILENO, &write_flags);

//call select
sel = select(comm_fd+1, &read_flags, &write_flags, (fd_set*)0, &waitd);

//if an error with select
if(sel < 0)
continue;

//if socket ready for reading
if(FD_ISSET(comm_fd, &read_flags)) {

//clear set
FD_CLR(comm_fd, &read_flags);

memset(&in, 0, 255);

numRead = recv(comm_fd, in, 255, 0);
//if an error, exit
if(numRead < 0) {
printf("\nError reading %m", errno);
myAgent->getRobot()->pauseSensorStream();
done = true;
} //end if error
//if connection closed, exit
else if(numRead == 0) {
printf("\nClosing socket");
close(comm_fd);
done = true;
} //end if connection closed
//if message, call getsendback
else if(in[0] != '\0') {
//std::cout<<"\nClient: "<<in;
getSendBack(in);
} //end if message
} //end if ready for read


//if stdin is ready for reading
if(FD_ISSET(STDIN_FILENO, &read_flags))
fgets(out, 255, stdin);


//if socket ready for writing
if(FD_ISSET(comm_fd, &write_flags)) {

//printf("\nSocket ready for write");
FD_CLR(comm_fd, &write_flags);

//check validity by checking for a digit
if(isdigit(out[0])) {

//create message to send
std::stringstream tosend;
tosend<<"@ "<<out;
//std::cout<<"\ntosend: "<<tosend.str();

//send
//********ERROR HAPPENS HERE PRINTS OUT MESSAGE BELOW******
numSent = send(comm_fd, tosend.str().c_str(), tosend.str().length(), 0);
} //end if valid message
//if error, exit
if(numSent < 0) {
printf("\nError sending %m", errno);
done = true;
} //end if error
//wait for message to get there, then clear
usleep(5000);
memset(&out, 0, 255);
} //end if
} //end while
} //END COMMUNICATE

客户端代码基本相同。

最佳答案

你是在自问自答。如果没有显式初始化 numSent 和 numRead,你会得到垃圾,它可能恰好是 numSent 的负数,如果 out[] 数组中没有数字,这将导致它出错。

关于sockets - 带有 BSD 套接字的错误文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7122254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com