방금 DCC SEND 부분을 추가 한 새 IRC 클라이언트를 작성하여 두 사용자 모두에게 직접 파일 전송을 지원합니다. 아무것도 아니에요, fancy, 저는 GUI 용 클라이언트와 Django에 irc 파이썬 라이브러리를 사용하고 있습니다. 훌륭한 miniupnpc lib는 포트 포워딩을 처리합니다. 그러나 파일이 제대로 전송/수신되는 동안 속도는 절대적으로 엄청납니다 : 대략 20KB/s입니다. 서버를 테스트하기 위해 Hexchat을 사용하여 패키지를 보냈습니다. 업로드 속도는 최대 이론적 인 대역폭 속도 (즉, 우수)였습니다. 내가 놓친 일종의 버퍼를 찾으려고 노력했다. 결국, 내 업로드 속도가 왜 그렇게 진절머리 나고 어떤 통찰력을 필요로하는지 전혀 모르겠다. 다음은 업로드 스크립트의 관련 부분입니다.Python3; 데이터 전송 속도 : IRC 프로토콜, DCC 파일 전송
def on_dcc_connect(self, c, e):
t = threading.Timer(0, upload_monitoring, [self, c])
t.start()
log("connection made with %s" % self.nickname).write()
self.file = open(self.filename, 'rb')
self.sendBlock()
def sendBlock(self):
if self.position > 0:
self.file.seek(self.position)
block = self.file.read(1024)
if block:
self.dcc.send_bytes(block)
self.bytesSent = self.bytesSent + len(block)
else:
# Nothing more to send, transfer complete.
self.connection.quit()
def on_dccsend(self, c, e):
if e.arguments[1].split(" ", 1)[0] == "RESUME":
self.position = int(e.arguments[1].split(" ")[3])
c.ctcp("DCC", self.nickname, "ACCEPT %s %d %d" % (
os.path.basename(self.filename),
self.eport,
self.position))
def on_dccmsg(self, connection, event):
data = event.arguments[0]
bytesAcknowledged = struct.unpack("!Q", data)[0]
if bytesAcknowledged < self.bytesSent:
return
elif bytesAcknowledged > self.bytesSent:
self.connection.quit()
return
self.sendBlock()
send_bytes(block)
있어서 기본적인 socket.send()
방법이다. file.read()의 버퍼를 늘리면 클라이언트의 블록 수신 확인 (struct.pack)이 내 send 스크립트에서 제대로 읽히지 않기 때문에 struct.pack 오류가 발생합니다. 바이트 길이가 8 인 데이터가 아닙니다. file.read 버퍼를 변경해야합니까? 그렇다면 수신 된 바이트가 다운로더 측과 같이 송신 측에서 동일하지 않은 이유는 무엇입니까? 그렇지 않다면 어디서 업로드 속도를 향상시켜야합니까?
성능에 대한 재현 방법이 없기 때문에 이에 대해 말할 수는 없습니다. 내 생각 엔, 1KB 청크로 파일을 읽고 1KB 패킷으로 청크를 보내면 성능이 매우 떨어집니다. 최소한이 파일은 64/128/512KB 청크로 읽을 수 있으며 가능한 한 네트워크에서 보내는 패킷의 크기를 늘리십시오. – Bakuriu
그런 경우 bytesAcknowledged가 클라이언트가 보낸 acknoldgement와 다른 이유는 무엇입니까? 그것은 단지'structured = struct.pack ("! Q", self.dict [bot] [ "received_bytes"])'그리고 나서'connection.send_bytes (structured) '입니다. – mrj
당신이 나에게 묻고있는 것을 이해하지 못합니다. 소켓을 통해 데이터를 보낼 때 * 커널 *이 메시지를 더 많은 패킷으로 나누기로 결정하면 클라이언트가 데이터를 더 적게 읽게됩니다. 필요한 모든 데이터를받을 때까지 여러 번 전화를 거는 것은 귀하의 책임입니다. – Bakuriu