【发布时间】:2014-12-12 20:34:08
【问题描述】:
我的服务器代码中有一个小问题,当客户端关闭连接时再次重新启动它并继续侦听另一个客户端,而无需终止/重新启动整个程序。当我在重启后尝试发送数据包时,我收到一条错误消息“Broken Pipe”。如果我杀死整个程序并立即重新启动它,一切正常。为什么?我只关闭套接字;还有其他命令可以适当地关闭连接吗? 遵循我的代码:
重启连接部分:
if(command[14]==END_TRANS)
{
command[14] = 0x00;
// Close serial and TCP communications and Opencv processes
close_capture = 1;
serial->~UARTcom();
tcp_server->~TCPServer();
std::cout<<""<<std::endl;
std::cout<<"Restarting connections..."<<std::endl;
sleep(2);
// Re-Start serial and TCP communications
UARTcom *serial = new UARTcom(serial_device);
TCPServer *tcp_server = new TCPServer(tcp_port);
memset(size_imudata_buff, 0, sizeof(int)+DATA_SIZE);
memset(ack_imucomm_buff, 0, sizeof(int)+COMMAND_SIZE);
if(pthread_create(&th_capture, NULL, capture, NULL))
{
perror("main() Create th_stream failed");
exit(1);
}
continue;
}
TCPServer 类:
/**********************************************************************
*CONSTRUCTOR: Create a new socket, establishing a default destination
*to the port.
*********************************************************************/
TCPServer::TCPServer(int serv_port)
{
// Adress initialization
memset((char *)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = PF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(serv_port);
// Create socket
if((serverSock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
std::perror("TCPServer() Create socket failed");
exit(1);
}
std::cout<<"TCPServer() Created socket sd="<<serverSock<<std::endl;
int optval = 1;
if(setsockopt(serverSock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
{
std::perror("TCPServer() Set option failed");
exit(1);
}
// Bind socket
if(bind(serverSock,(struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
std::perror("TCPServer() Bind failed");
exit(1);
}
std::cout<<"TCPServer() Bind socket"<<std::endl;
// Listen for incoming connection
if(listen(serverSock,5) < 0)
{
std::perror("TCPServer() Listen failed");
exit(1);
}
std::cout<<"TCPServer() --> Waiting for TCP connection on port "<<serv_port<<std::endl;
// Accept connection and receive client address
if((connectSock = accept(serverSock,(sockaddr*)&clientaddr,&clientaddrlen))<0)
{
std::perror("TCPServer() Accept failed");
exit(1);
}
std::cout<<"TCPServer() --> TCP connection estabilished with "<<inet_ntoa(clientaddr.sin_addr)<<std::endl;
}
/**********************************************************************
*DESTRUCTOR: Close the socket
*********************************************************************/
TCPServer::~TCPServer(void)
{
if(close(serverSock) < 0)
{
std::perror("TCPServer() Close socket failed");
exit(1);
}
std::cout<<"TCPServer() Socket closed"<<std::endl;
}
/**********************************************************************
*TCPServer::receiveData() receive data from socket defined
*through connect() function
*********************************************************************/
int TCPServer::receiveData(char* data, int len)
{
return recv(connectSock, data, len, 0);
}
/**********************************************************************
*TCPServer::sendData() send data to socket defined through
*connect() function
*********************************************************************/
int TCPServer::sendData(char* data, int len)
{
return send(connectSock, data, len, 0);
}
当我运行程序然后断开-重新连接客户端时得到的输出:
UARTcom() Serial port open on /dev/ttyUSB0
TCPServer() Created socket sd=13
TCPServer() Bind socket
TCPServer() --> Waiting for TCP connection on port 8080
TCPServer() --> TCP connection estabilished with 192.168.1.56
UARTcom() Serial connection closed
TCPServer() Socket closed
Restarting connections...
UARTcom() Serial port open on /dev/ttyUSB0
TCPServer() Created socket sd=13
TCPServer() Bind socket
TCPServer() --> Waiting for TCP connection on port 8080
TCPServer() --> TCP connection estabilished with 192.168.1.56
main() Failed to send size of frame and IMU data: Broken pipe
main() Failed to send size of frame and IMU data: Broken pipe
main() Failed to send size of frame and IMU data: Broken pipe
main() Failed to send size of frame and IMU data: Broken pipe
谁能解释一下为什么?
【问题讨论】:
-
你为什么要直接调用你的析构函数?
-
serial->~UARTcom();这不是删除对象的方法(如果这是你想要做的)。您应该使用:delete serial;。也许买一本书并从头开始学习:stackoverflow.com/questions/388242/… -
这解决了我的问题。我是 C++ 的新手(我是 C 移民),我不知道取消实例需要调用“删除”例程。非常感谢。
-
@Galik 将您的答案变成了社区 wiki 答案。如果您想在您的帐户下发布它,我将删除我的答案并给您一些互联网积分。