我正在使用unix套接字在c ++中开发一个简单的服务器/客户端聊天应用程序,有一件事困扰着我。
如果我在终端中运行聊天客户端(我正在使用mac)并使用CTRL + C关闭客户端,则完成四次握手并且连接正确关闭。
如果我选择关闭客户端正在运行的终端窗口,客户端会向服务器发送一堆数据包。
使用CTRL + C关闭客户端:
关闭终端窗口关闭客户端:
如果有人能向我解释发生了什么,那就太好了。
客户代码:
void writeString(int FD, const char* data, size_t n){
size_t bytesLeft = n;
ssize_t bytesWritten = 0;
const char *cBuffer = (char*) data;
while ((bytesWritten = write(FD, cBuffer, bytesLeft)) > 0) {
bytesLeft -= bytesWritten;
cBuffer += bytesWritten;
}
}
bool writeInt(int FD, int intToWrite){
intToWrite = htonl(intToWrite);
write(FD, &intToWrite, sizeof(intToWrite));
}
void writeMessage(int FD, int type, int ID, string message){
if(type == 1){
int messageSize = (int) message.length();
writeInt(FD, type);
writeInt(FD, ID);
writeInt(FD, messageSize);
writeString(FD, message.c_str(), messageSize);
}
}
while (!connectionClosed) {
FD_SET(socketFD, &rset);
FD_SET(0, &rset);
int maxfd = max(0, socketFD) + 1;
select(maxfd, &rset, NULL, NULL, NULL);
if(FD_ISSET(0, &rset)){
getline(cin, input);
writeMessage(socketFD, 1, ID, input);
}else if(FD_ISSET(socketFD, &rset)){
int type = 0;
if(readInt(socketFD, type) == 0)
connectionClosed = true;
readMessage(socketFD, type, ID);
}
}
close(socketFD);
答案 0 :(得分:0)
我的猜测是当你用关闭按钮关闭终端时,它正在发送一些标准终端命令来结束到PTY的会话。由于您的聊天应用程序正在运行,因此您的聊天应用程序会拦截这些命令,并将其转发到服务器。
例如,telnet协议包含很多内容的控制代码,包括中断和中止正在运行的进程。
您是否查看了正在发送的实际数据包内容?
关于PSH(推),这里解释得很好,例如:
http://packetlife.net/blog/2011/mar/2/tcp-flags-psh-and-urg/
您可能还想在客户端应用程序中将日志记录添加到磁盘,以便稍后在关闭终端窗口时检查正在进行的操作。
甚至可以从另一个终端窗口向正在运行的客户端附加调试会话。