linux python socket怎么去除

作者&投稿:冀凝 (若有异议请与网页底部的电邮联系)
如何终止用python写的socket服务端程序~

# -*- coding: utf-8 -*-
import socket
import threading, time

def tcplink(sock,addr):
print('Accept new connection from %s:%s...' %addr)
sock.send(b'Welcome!')
while True:
data=sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8')=='exit':
break
sock.send(('Hello,%s!'% data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)

s=socket.socket()

你先去了解socket能做什么,然后你就试着用socket去做他能做的事,再实现的过程中你就是在学习。

原因是server端关掉了tcp连接,给client发送FIN信号,client的tcp层回了ACK,然后它的socket状态就处于close_wait状态。

实验:

Python中,socket在send之前处于close_wait状态,那么该send不会报错,并且执行完之后socket就closed了。再继续调用send就会报错。


推理:

说明python的socket.send在发送数据之前会检查socket的状态,如果处于close_wait,就执行close(socket)(应用层感觉不到哦),然后正常退出。所以再次send时,会抛出异常。


为什么会一直处close_wait状态?

当socket处于close_wait时,必须由应用层调用close(socket),发送FIN给server端才能变为LAST_ACK,接收到server端回应的ACK后,才变为CLOSED。如果应用层不调用close(),那么socket会一直处于close_wait。[1]


如果我在python中不断循环去调用socket.sendall(),那么在socket变为close_wait后,通过socket.sendall()也会关闭socket,为什么它还是一直处在close_wait状态呢?

原因在于当sendall(data)的data比较大,在data被发送一半时,连接被server端断掉了。那么sendall(data)会一直卡在那,也就不会执行到sendall的开始处,去判断socket状态,确定是否关闭socket了。

简单而言,就是socket在变为close_wait之后,根本没有调用sendall()去关闭socket。





修武县17195289164: python 怎么利用已存在的sock发送消息 -
赞纪亿尔: 示例 import socket, sys port = 55555 host = 'localhost' data = "test" * 10485760 # 40MB of data s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, port)) byteswritten = 0 while byteswrittenstartpos = byteswritten ...

修武县17195289164: linux 下python socket缓冲区大小有限制吗?怎么样能增加? -
赞纪亿尔: 是有一个函数,具体看这里:http://docs.python.org/howto/sockets.html

修武县17195289164: linux python怎么获得本级所有ip -
赞纪亿尔: >>> from socket import socket, SOCK_DGRAM, AF_INET>>> s = socket(AF_INET, SOCK_DGRAM)>>> s.connect(('google.com', 0))>>> s.getsockname()('192.168.1.113', 43711)

修武县17195289164: Python脚本在Linux上怎么运行 -
赞纪亿尔: linux有下列的几种方法来运行python脚本:(注:我所用的python环境为 2.6) 一. 终端命令行下 []$python "name.py" 二. python环境中 若脚本名称为name.py,其内容为:a='head' b='hehe' print(a,b) 则使用 >>>impport name 针对此种方法我们...

修武县17195289164: linux下的socket编程在哪进行? -
赞纪亿尔: LINUX下的SOCKET编程?应该所有语言都有相应的SOCKET编程接口.C/C++、JAVA,python,RUBY,PERL,甚至是SCEME.只不过,其他几种都是跨平台的,不算是单独的LINUX下SOCKET编程.一般C语言和C++才这么说.因为LINUX下...

修武县17195289164: 如何在ubuntu中命令行关闭python socket服务器 -
赞纪亿尔: 本文介绍下,在solaris 系统下,python socket server重启后,提示端口被占用,telnet端口失败.这里给出一个解决方法,有需要的朋友参考下.在solaris 系统下,socket server被重启后,提示端口被占用,telnet端口又是不成功的,说明服务已...

修武县17195289164: 如何实现Linux下异步socket通讯 -
赞纪亿尔: 个人的一点见解:如果要利用linux系统所提供的接口,应该考虑的是接口的参数类型及返回类型,可以使用C++风格的代码对C的接口进行一下封装,在封装内部实现数据类型的转换和通行工作,并考虑可以预见的异常情况.

修武县17195289164: python socket怎么测试服务端有效 -
赞纪亿尔: 首先先建立一个python文件,命名为 socket_server1.py 下面是相关的步骤图.(图片来源python官方资料参考) 先导入相关的模块.并且定义相关的主机及端口.(相关参数可以参考下图) 完整的socket_server1.py文件.设置好之后,通过命令提示...

修武县17195289164: 如何在linux下运行python程序 -
赞纪亿尔: 终端命令行执行python脚本文件:$ python 文件名 python脚本文件名是以 .py 结尾的,而且要进入到包含该文件名的目录下才能执行.交互提示模式下运行.在终端输入$python 即可进入交互提示模式,然后输入python代码.利用IDLE用户界面.终端直接输入$idle 利用其他ide工具,例如eclipse+pydev

修武县17195289164: python sock.recv最大能接收多少 -
赞纪亿尔: 不同操作系统不同,由TCP协议定,比如 Linux 2.6.6 :/proc/sys/net/core/rmem_max: 4194304 //4M 查看/proc/sys/net/core/wmem_max: 8388608 //8M 所以,能设置的接收缓冲区的最大值是8M,发送缓冲区的最大值是16M.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网