我正在使用这段代码发送我从这个网站获得的套接字命令。
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())) 但它不起作用。
答案 0 :(得分:1)
boost::asio::ip::tcp::socket
有is_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
}