def safeSend(sock,msg):
sent=0
while msg:
i=sock.send(msg)
if i==-1: # 发生了错误
return -1
sent+=i
msg=msg[i:]
time.sleep(25)
return sent
recv(bufsize[,flags]) 方法接收一个进来的消息。如果有大量的数据在等待,它只返回前面的
bufsize 字节数的数据。 recvfrom(bufsize[,flags]) 做同 样的事,除了它使用 AF_INET socket
的返回值是 (data,(ipAddress,port)), 这便于你知道消息来自哪儿 (这对于非连接的 socket 是有
用的)。
send,sendto,recv 和 recvfrom 方法都有一个可选的参数 flags ,默认值为 0。你可以通过对
socket.MSG_* 变量进行组合(按位或)来建立 flags 的值。这些值因平台而有所不同,但是
最通用的值如下所示:
MSG_OOB: 处理带外数据(既 TCP 紧急数据)。
MSG_DONTROUTE: 不使用路由表;直接发送到接口。
MSG_PEEK: 返回等待的数据且不把它们从队列中删除。
例如,如果你有一个打开的 socket,它有一个消息等待被接收,你可以接收这个消息后并不
把它从进来的数据的队列中删除:
>>> q.recv(1024,MSG_PEEK)
'hello'
>>> q.recv(1024,MSG_PEEK) # 因为没有删除,所以你可以再得到它。
'hello'
makefile([mode[,bufsize]]) 方法返回一个文件类对象,其中封装了 socket,以便于你以后将
它传递给要求参数为一个文件的代码(或许你喜欢使用文件的方法来代替 send 和 recv)。
这个可选的 mode 和 bufsize 参数的取值和内建的 open 函数一样。
4、使用 socket 选项
socket 对象的 getpeername()和 getsockname()方法都返回包含一个 IP 地址和端口的二元组
(这个二元组的形式就像你传递给 connect 和 bind 的)。 getpeername 返回所连接的远程
socket 的地址和端口, getsockname 返回关于本地 socket 的相同信息。
在默认 情况下, socket 是阻塞式的,意思就是 socket 的方法的调用在任务完成之前是不会
返回的。例如,如果存储向外发送的数据的缓存已满,你又企图发送 更多的数据,那么你