我在嵌入式linux下运行TCP / IP服务器:
int sId = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
sockaddr_in servAddr;
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(5000);
bind(sId, (sockaddr*)(&servAddr), sizeof(servAddr));
listen(sId, 10);
int cId = accept(sId, NULL, NULL);
执行上面的代码后,我可以通过read()从客户端接收消息,并使用write()发送响应。例如:
for (;;)
{
int c = std::cin.get();
switch(c)
{
case 'q': break;
case 'r': recv(cId, /*...*/ , MSG_DONTWAIT); // I skip the code responsible for displaying the message
case 'w': write(cId, ... // as above
}
}
只要客户端连接,一切都很好。当客户端断开连接并尝试向其发送消息时,问题就开始了。当我在断开连接后第一次调用write()时它返回成功,当我第二次调用它时,程序退出而没有错误。
有没有一些聪明的方法可以检测到这样的错误?
PS。我添加了简化代码来解决问题。在创建的程序中,接收消息和发送回复在单独的线程中实现。这就是为什么我在寻找能让我在调用write()时检测错误的东西。