C++ 使用 send_to 提升 unix 域套接字

Posted

技术标签:

【中文标题】C++ 使用 send_to 提升 unix 域套接字【英文标题】:C++ boost unix domain socket using send_to 【发布时间】:2012-05-09 21:00:59 【问题描述】:

我正在尝试编写一个非常简单的 unix 域数据报客户端/服务器。

这里是python服务器:

import socket,os

s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
try:
    os.remove("/tmp/socketname")
except OSError:
    pass
s.bind("/tmp/socketname")
while 1:
    data = s.recv(1024)
    print data

conn.close()

这是一个 python 客户端,似乎可以与服务器正常工作

import socket
import time

sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.sendto('Hello, world', "/tmp/socketname")
sock.close()

本练习的目的是使用 boost::asio 网络库,python 代码只是通过一个简单的客户端来简化服务器以证明(-ish)服务器正在工作。

我在使用 C++ 客户端时遇到了一些问题:

#include <boost/asio.hpp>

int
main(void)

    const pid_t pid = getpid();
    boost::asio::io_service my_service;
    const boost::asio::local::datagram_protocol::endpoint ep("/tmp/socketname");
    boost::asio::local::datagram_protocol::socket my_sock(my_service);

    //my_sock.connect(ep);
    //my_sock.send(boost::asio::buffer(&pid, sizeof(pid)));
    my_sock.send_to(boost::asio::buffer(&pid, sizeof(pid)), ep);

    return 0;

如果我注释掉使用连接/发送的 2 行似乎可以工作。但是使用 send_to 的行失败并出现以下错误。

在抛出 'boost::exception_detail::clone_impl >' 的实例后调用终止 what():错误的文件描述符 中止

感谢您提供的所有帮助。

【问题讨论】:

【参考方案1】:

您从未通过调用open() 或任何其他自动打开套接字的方法(例如connect())打开套接字。

int
main(void)

    const pid_t pid = getpid();
    boost::asio::io_service my_service;
    const boost::asio::local::datagram_protocol::endpoint ep("/tmp/socketname");
    boost::asio::local::datagram_protocol::socket my_sock(my_service);

    //my_sock.connect(ep);
    //my_sock.send(boost::asio::buffer(&pid, sizeof(pid)));
    my_sock.open();
    my_sock.send_to(boost::asio::buffer(&pid, sizeof(pid)), ep);

    return 0;

【讨论】:

我不知道为什么,我只是认为套接字的构造函数会这样做。谢谢。

以上是关于C++ 使用 send_to 提升 unix 域套接字的主要内容,如果未能解决你的问题,请参考以下文章

提升UNIX安全性的配置

查找哈希与哈希数组的部分匹配

使用 C++ 获取 Unix 时间戳

编译旧的 C++ unix 应用程序以在 Windows 中使用

C++:我将如何获得 unix 时间?

如何从 Unix 命令行安装 c 和 c++ 编译器,然后与 Eclipse 一起使用?