Comment detail

echoクライアント (Nested Flatten)

クライアント機能に限定したnetcatコマンドを作りなさい、ということかしら?

題意が分かりにくかったのでしょうか。申し訳ありません。

自分が想定していたのは、Pythonで書くなら以下のようなコードだったのですが、題意はご自由に解釈していただいて構いません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
import sys
import os
import socket
from threading import Thread

class Receiver(Thread):
    def __init__(self, sock):
        Thread.__init__(self)
        self.src = sock
    def run(self):
        for data in iter(lambda: self.src.recv(8192), ""):
            os.write(sys.stdout.fileno(), data)

def main(args):
    if len(args) < 3:
        print >>sys.stderr, "usage: %s host port" % args[0]
        sys.exit(1)
    if sys.platform == 'win32':
        sys.stdin.setmode(os.O_BINARY)
        sys.stdout.setmode(os.O_BINARY)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((args[1], int(args[2])))
    receiver = Receiver(sock)
    receiver.start()
    for data in iter(lambda: os.read(sys.stdin.fileno(), 8192), ""):
        sock.send(data)
    sock.shutdown(socket.SHUT_WR)
    receiver.join()
    sock.close()
    return 0

if __name__ == '__main__':
    main(sys.argv)

ええと、さっきのは#7138さんへのレスです。それと、コードが間違っていたので修正します。 setmode()はmsvcrtの関数でした。

「netcatのクライアント部分と同等」であるかは、netcatコマンドの仕様に詳しくないので、申し訳ありませんが何ともいえません。

echoはR.Stevensのunpvのようなネットワークプログラミングの教科書の最初のサンプルとして出てくることが多いでしょうから、その多言語版クックブックという観点を考えていました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python
import sys
import os
import socket
from threading import Thread
import msvcrt

class Receiver(Thread):
    def __init__(self, sock):
        Thread.__init__(self)
        self.src = sock
    def run(self):
        for data in iter(lambda: self.src.recv(8192), ""):
            os.write(sys.stdout.fileno(), data)

def main(args):
    if len(args) < 3:
        print >>sys.stderr, "usage: %s host port" % args[0]
        sys.exit(1)
    if sys.platform == 'win32':
        msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((args[1], int(args[2])))
    receiver = Receiver(sock)
    receiver.start()
    for data in iter(lambda: os.read(sys.stdin.fileno(), 8192), ""):
        sock.send(data)
    sock.shutdown(socket.SHUT_WR)
    receiver.join()
    sock.close()
    return 0

if __name__ == '__main__':
    main(sys.argv)

Index

Feed

Other

Link

Pathtraq

loading...