自動命名のAF_UNIX現地データグラムソケッツ?
質問
私の実施の簡単なサービスを利用datagrams上unix地元のソケッツ(AF_UNIXアドレスファミリは、 なUDP).サーバーには、公共の住所、請求を受けです。残念ながら、時に応答、 sendto
失敗しないクライアントは行きます。(共通のエラー Transport endpoint is not connected
).
結ンダ名(ファイルシステムや抽象)。してしまいましたが、まず私がそういう風にならないように:一体何者なのか、という保証は名称かんぶつか?
Unixのソケット'ストリームモードを文書化していくことで抽象的な名前を割り当てますし connect
時間のない一つです。そんな特徴を利用データグラム指向のソケッツ?
解決
なっているのでしょうかいたりするLinux;わからない場合はこのアドバイスに適用されSunOSはUNIX.
最初の答え:後は、socket()以前のconnect()は最初に送る()、このコード:
struct sockaddr_un me;
me.sun_family = AF_UNIX;
int result = bind(fd, (void*)&me, sizeof(short));
現在、説明:のの unix(7) manページはこ
ソケットが接続されたときで ない地域の住所、 固有のアドレスの概要 名前空間が生成される ます。
あのmanページがあると考えています。
を検討し Linuxソースコード, をまとめると、unix_dgram_connect()のみ通話unix_autobind()の場合SOCK_PASSCREDのソケットフラグがあります。以降どうなるかはわからないSOCK_PASSCREDは、その1:00ながらプレーする必要がありまも。
検討 unix_bind, がunix_bind話unix_autobindが渡されたサイズが等価"になsizeof(短)".これにより、溶液ます。
良皆さま、おはようございます。
Rob
他のヒント
の unix(7) manページで参照されたことに関する情報autobind UNIXソケット:
場合は、bind(2)コールを指定しaddrlenとしてsizeof(sa_family_tのSO_PASSCREDソケットオプション指定されたソケットが明示されていないアドレスにバインドされて、そのソケットがautoboundめの抽象アドレスです。
そのため、Linuxカーネルのチェックのアドレスの長さが等しいsizeof(短)でsa_family_tである。その他のunix(7)manページによって参照されるRobの答えというクライアントソケットは常にautoboundに接続でSOCK_DGRAMソケットはconnectionless(あ接続していないことだと思いこみに適用されSOCK_STREAMソケット
また、供給するときの自分の抽象名前空間のソケットの名前は、ソケットのアドレスがこの名前空間を指定のバイトsun_pathで表面を覆っていることにより、指定された長さのアドレス構造です。
struct sockaddr_un me;
const char name[] = "\0myabstractsocket";
me.sun_family = AF_UNIX;
// size-1 because abstract socket names are not null terminated
memcpy(me.sun_path, name, sizeof(name) - 1);
int result = bind(fd, (void*)&me, sizeof(me.sun_family) + sizeof(name) - 1);
送()は同様に制限のアドレスの長さはsizeof(sockaddr_un).
少し遅めの対応が良い見本ですとと思います。Robダの答えを中心としたのか:単に利用セット(レベル SO_SOCKET
, 参照 man 7 unix
設定 SO_PASSCRED
1になります。な愚連結します。
このPHPのではない SO_PASSCRED
(愚かなサポートに対するコミットメント.ない場合がご指定することができます。コンピュータの値の16日、とうとなかなかportably.
私はいかのご質問は完全にが、ここではデータグラムの実施エコーサーバーだけたものを書く。きに、サーバ対応クライアントに同じIPポートで送信された。
こちらのコード
第一に、サーバー(listener)
from socket import *
import time
class Listener:
def __init__(self, port):
self.port = port
self.buffer = 102400
def listen(self):
sock = socket(AF_INET, SOCK_DGRAM)
sock.bind(('', self.port))
while 1:
data, addr = sock.recvfrom(self.buffer)
print "Received: " + data
print "sending to %s" % addr[0]
print "sending data %s" % data
time.sleep(0.25)
#print addr # will tell you what IP address the request came from and port
sock.sendto(data, (addr[0], addr[1]))
print "sent"
sock.close()
if __name__ == "__main__":
l = Listener(1975)
l.listen()
現在、クライアント(送信者)を受ける、応答からリスナー
from socket import *
from time import sleep
class Sender:
def __init__(self, server):
self.port = 1975
self.server = server
self.buffer = 102400
def sendPacket(self, packet):
sock = socket(AF_INET, SOCK_DGRAM)
sock.settimeout(10.75)
sock.sendto(packet, (self.server, int(self.port)))
while 1:
print "waiting for response"
data, addr = sock.recvfrom(self.buffer)
sock.close()
return data
if __name__ == "__main__":
s = Sender("127.0.0.1")
response = s.sendPacket("Hello, world!")
print response