如何检查套接字是否已连接

时间:2015-10-23 05:24:19

标签: c++ c++11 visual-c++

我正在使用这段代码发送我从这个网站获得的套接字命令。

void SendExternalCommand(std::string Cmd,const std::string HostName,const int Port)
{

boost::asio::io_service io;
boost::asio::ip::tcp::socket socket(io);
boost::asio::ip::tcp::endpoint   
e(boost::asio::ip::address::from_string(HostName), Port);
socket.open(boost::asio::ip::tcp::v4());
socket.connect(e) ;
socket.write_some(boost::asio::buffer(Cmd));
socket.send(boost::asio::buffer(Cmd));
}

如何检查套接字是否可用。

我试过if(!socket.open(boost :: asio :: ip :: tcp :: v4())) 但它不起作用。

2 个答案:

答案 0 :(得分:1)

boost::asio::ip::tcp::socketis_open()方法,似乎可以给出结果。

但是,您应该知道在调用is_open然后使用send发送数据之间,可以关闭套接字。此外,TCP写入函数通常在将数据复制到内核缓冲区后立即返回。如果发送失败,您将在下次发送时收到错误。

通常,从套接字读取也是一个好主意,因为这是检测已关闭连接的可靠方法。作为关闭过程的一部分,当客户端关闭连接时,对recv的调用将返回0的结果。我不知道boost :: asio实现了什么,所以最好查看文档。

答案 1 :(得分:0)

您可以尝试使用getsockopt,如下所示:

int err = 0;
socklen_t size = sizeof (err);
int check = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &err, &size);
if (check != 0) 
{
   //some code
}

另请参阅:How can I check is a socket is still open?

相关问题