Python'un ezme modülünü kullanarak basit bir çok dişli tcp sunucusu oluşturdum. Bu sunucu, yeni bir istemci her bağlandığında yeni bir konu oluşturur.Python'da Çok Yönlendirmeli TCP sunucusu
#!/usr/bin/env python
import socket, threading
class ClientThread(threading.Thread):
def __init__(self,ip,port):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
print "[+] New thread started for "+ip+":"+str(port)
def run(self):
print "Connection from : "+ip+":"+str(port)
clientsock.send("\nWelcome to the server\n\n")
data = "dummydata"
while len(data):
data = clientsock.recv(2048)
print "Client sent : "+data
clientsock.send("You sent me : "+data)
print "Client disconnected..."
host = "0.0.0.0"
port = 9999
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind((host,port))
threads = []
while True:
tcpsock.listen(4)
print "\nListening for incoming connections..."
(clientsock, (ip, port)) = tcpsock.accept()
newthread = ClientThread(ip, port)
newthread.start()
threads.append(newthread)
for t in threads:
t.join()
Sonra iki yeni terminal açtım ve netcat kullanarak sunucuya bağlandım. Ardından, ilk veriyi bağladığım ilk terminali kullanarak sunucuya ilk veri yazıp gönderdiğimde, sunucudan yanıtı diğer terminale gelir ve ilk bağlantı kesildi. Nedeni tahmin ettim ama bunun gerçekleşip gerçekleşmediğinden şüphe duyuyorum çünkü clientsock değişkeninin üzerine yazıldığından, ikinci bağlantı soketine başvurur. Doğru muyum ve bundan nasıl kurtulurum?
Sınırlı sayıda soket değişkenine sahip bir dizi kullanmak ve her bağlantı için her bir değişkeni kullanmaktan başka bir yolu var mı? Burada bir var bu güzel sınıfı oluşturduk
class ClientThread(threading.Thread):
def __init__(self, ip, port, socket):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.socket = socket
print "[+] New thread started for "+ip+":"+str(port)
def run(self):
# use self.socket to send/receive
...
(clientsock, (ip, port)) = tcpsock.accept()
newthread = ClientThread(ip, port, clientsock)
...
Endişelenme, bu iyi bir soru. StackOverflow'a hoş geldiniz! – Jordan
Son iki çizgiye asla ulaşamayacaksınız. Bu kasıtlı mı? –