3

非常に単純な 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 >' what() のインスタンスをスローした後に呼び出された終了: 不正なファイル記述子が中止されました

提供されたすべてのヘルプに感謝します。

4

1 に答える 1

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;
}
于 2012-05-09T21:09:15.317 に答える