Michael Garrido
Michael Garrido

Reputation: 1

Sending a file over TCP connection

I want to send i file over TCP but when i try to run this the connection fails, the server receives the file but it gives this error: ERROR: Client timed out before sending a file

import selectors
import sys
from socket import *
import sock

sel1 = selectors.DefaultSelector()
print(len(sys.argv), sys.argv[1], sys.argv[2], sys.argv[3])

host = sys.argv[1]
port = int(sys.argv[2])
file = sys.argv[3]


try:
    # Instaniating socket object
    s = socket(AF_INET, SOCK_STREAM)
    # Getting ip_address through host name
    host_address = gethostbyname(host)
    # Connecting through host's ip address and port number using socket object
    s.connect((host_address, port))

    sel1.register(
        sock,
        selectors.EVENT_READ, data = None)
    fileToSend = open("file.txt", "rb")
    data = fileToSend.read(1024)
    while data:
        print("Sending...")
        fileToSend.close()
        s.send(b"Done")
        print("Done Sending")
        print(s.recv(1024))
        s.shutdown(2)
        s.close()



except:
# Returning False in case of an exception
 sys.stderr.write("Connection Failed")

Upvotes: 0

Views: 400

Answers (1)

Tim Roberts
Tim Roberts

Reputation: 54635

Do the writing in a loop. There's no particular reason to chop it into 1024-byte pieces; the network stack will handle that for you.

By the way, your "Done" signal is not a good idea, especially since you're writing a binary file that might very well contain the word "Done". Remember that TCP is a streaming protocol. The other end does not see the exact packets you're sending. That is, just because you send 1024 bytes and 4 bytes, the other end might see it as reads of 256 and 772 bytes.

# Instaniating socket object
s = socket(AF_INET, SOCK_STREAM)
# Getting ip_address through host name
host_address = gethostbyname(host)
# Connecting through host's ip address and port number using socket object
s.connect((host_address, port))

fileToSend = open("file.txt", "rb")
print("Sending...")
while True:
    data = fileToSend.read(1024)
    if not data:
        break
    s.send( data )

fileToSend.close()
s.send(b"Done")
print("Done Sending")
print(s.recv(1024))
s.close()

Upvotes: 1

Related Questions