我如何使用socket.connect?

时间:2014-02-16 00:38:53

标签: python networking

我是python和网络的新手。我应该在s.connect中输入什么地址和端口?另外,我是否在s.connect中正确使用变量?

import socket
recAddress = input("What is the address of the receiver of your messages?")
recPort = input("What port is the receiver using?")
def mysend(sock, msg):
    totalsent = 0
    while totalsent < MSGLEN:
        sent = sock.send(msg[totalsent:])
        if sent == 0:
            raise RuntimeError("socket connection broken")
        totalsent = totalsent + sent

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((recAddress, recPort))

i = 2
mysend(s, str(i))

1 个答案:

答案 0 :(得分:0)

由于评论中解释的原因,我不会回答关于“如何知道要传递给该程序的IP和端口”的模糊问题。

但是关于代码的具体问题:

  

另外,我是否在s.connect中正确使用变量?

几乎,但不完全。

你得到这样的值:

recAddress = input("What is the address of the receiver of your messages?")
recPort = input("What port is the receiver using?")

假设这是Python 3.x,input返回一个字符串。但是connect(对于IPv4连接)需要端口的,而不是字符串。所以,你必须把它转换成某个地方。

您可以在输入时立即执行此操作:

recPort = int(input("What port is the receiver using?"))

...或者您可以在connect电话中执行此操作:

s.connect((recAddress, int(recPort)))

如果这个假设是错误的并且您使用的是Python 2.x,那么input将尝试评估输入字符串,这意味着您将获得recPort的数字...但是你没有正确阅读recAddress,除非你想强迫用户在IP地址周围加上引号。

一般来说,你几乎不想使用input;改为调用raw_input - 如果你这样做,你会得到一个字符串,一切都与我上面描述的Python 3.x完全相同。


最后,一些附注:

通常最好调用create_connection,而不是显式创建IPv4套接字并在其上调用connect。这样,如果您以后切换到兼容IPv6的网络,您的程序仍然可以正常工作(只要用户提供IPv6地址,或解析为一个的DNS地址)。

套接字上的sendall方法已经执行了您尝试使用mysend函数手动执行的操作。虽然有时候明确地循环send会很有用(例如,如果你试图调试错误,这意味着你可以确切地说出错误的地方),一般来说,只使用它更简单send all

此外,在该循环中,您使用的是常量MSGLEN,您没有在任何地方定义,这显然不会起作用。而且,即使你 在某处定义了它,如果len(msg)MSGLEN不同,你会想要发生什么?例如,如果MSGLEN4,而msg'2'(如您的示例所示),则会发送2个字节,然后继续尝试发送0个字节再次。或者,如果MSGLEN1msg'42',则会误导性地发送2个字节而不是1个。最有可能的是,您想使用len(msg)那里,不是MSGLEN