Reputation: 703
I am trying to create an encrypted chat application using RSA algo in python but I am getting error messages. I am unable to find the errors in the code and the chat system is not working at all. The client.py is terminating with showing this error
File "client.py", line 17, in
server_string = server.recv(1024)
OSError: [Errno 107] Transport endpoint is not connected
The codes are:
the server.py is:
import socket
from Crypto.PublicKey import RSA
from Crypto import Random
#Generate private and public keys
random_generator = Random.new().read
private_key = RSA.generate(1024, random_generator)
public_key = private_key.publickey()
#Declartion
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname(socket.getfqdn())
port = 8888
encrypt_str = "encrypted_message="
if host == "127.0.1.1":
import commands
host = commands.getoutput("hostname -I")
print("host = " + host)
#Prevent socket.error: [Errno 98] Address already in use
mysocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
mysocket.bind((host, port))
mysocket.listen(5)
c, addr = mysocket._accept()
while True:
#Wait until data is received.
data = c.recv(1024)
data = data.replace("\r\n", '') #remove new line character
if data == "Client: OK":
c.send("public_key=" + public_key.exportKey() + "\n")
print("Public key sent to client.")
elif encrypt_str in data: #Reveive encrypted message and decrypt it.
data = data.replace(encrypt_str, '')
print("Received:\nEncrypted message = "+str(data))
encrypted = eval(data)
decrypted = private_key.decrypt(encrypted)
c.send("Server: OK")
print("Decrypted message = " + decrypted)
elif data == "Quit": break
#Server to stop
c.send("Server stopped\n")
print("Server stopped")
c.close()
The client.py is
import socket
from Crypto.PublicKey import RSA
import sys
import os
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "127.0.0.1"
port = 7777
server.bind(("my_IP_addr_goes_here", 8880))
#data= "Client: OK"
#Tell server that connection is OK
#server.sendall("Client : OK")
#Receive public key string from server
server_string = server.recv(1024)
#Remove extra characters
server_string = server_string.replace("public_key=", '')
server_string = server_string.replace("\r\n", '')
#Convert string to key
server_public_key = RSA.importKey(server_string)
#Encrypt message and send to server
message = "This is my secret message."
encrypted = server_public_key.encrypt(message, 32)
server.sendall("encrypted_message="+str(encrypted))
#Server's response
server_response = server.recv(1024)
server_response = server_response.replace("\r\n", '')
if server_response == "Server: OK":
print("Server decrypted message successfully")
#Tell server to finish connection
server.sendall("Quit")
print(server.recv(1024)) #Quit server response
server.close()
The errors are: The server script is running but when I am terminating the script it's showing
For server.py: ^CTraceback (most recent call last):
File "server.py", line 28, in <module>
c, addr = mysocket._accept()
KeyboardInterrupt
For client.py: File "client.py", line 17, in
server_string = server.recv(1024)
OSError: [Errno 107] Transport endpoint is not connected
Upvotes: 2
Views: 4732
Reputation: 31060
You want to capture SIGINT... See How do I capture SIGINT in Python?
import signal
import sys
def stop_server(sig, frame):
server.sendall("Quit")
print(server.recv(1024)) #Quit server response
server.close()
sys.exit(0)
signal.signal(signal.SIGINT, stop_server)
Upvotes: 4