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

时间:2012-05-09 21:01:00

标签: c++ ipc boost-asio

我正在尝试编写一个非常简单的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;
}

如果我注释掉使用connect / send的2行似乎有效。但是使用send_to的行失败并出现以下错误。

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

感谢您提供的任何和所有帮助。

1 个答案:

答案 0 :(得分:3)

您从未通过调用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;
}