免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11400 | 回复: 7
打印 上一主题 下一主题

socket broken pipe [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-01 19:59 |只看该作者 |倒序浏览
server端的代码如下:
while True:
    sock,address = server_socket.accept()
    data = sock.recv(bufsize)
    while data != '':
        data = sock.recv(bufsize)
    print 'sock closed by peer'
    string = 'nihao,client'
    a = 0
    while True:
        a += sock.send(string)
        time.sleep(1)
        print a
    print 'write finish: %d' % a


客户端的代码就是连接,然后发送一段数据,然后close

问题是: 服务端在recv的时候通过while  data != '' 来控制一直读直到socket被客户端关闭,然后进行写,按照常理在第一次写的时候就应该出现broken pipe的错误,但实际运行时实在第二次写的时候才引发该错误

也是运行时的输出是:
sock closed by peer
12
Traceback (most recent call last):
  File "./server.py", line 25, in ?
    a += sock.send(string)
socket.error: (32, 'Broken pipe')

为什么不是第一次send的时候就出现broken pipe?

多谢

论坛徽章:
0
2 [报告]
发表于 2009-06-02 03:24 |只看该作者
没看到你client的代码,不好解释
tcp是半关闭的,有可能是当你send的时候,client只是关闭
了自己的发送,而还可以接收,你把time.sleep(1)放到send前面
看看是第几次发生broken pipe的

以上为鄙人拙见,仅供参考

论坛徽章:
0
3 [报告]
发表于 2009-06-02 08:02 |只看该作者

回复 #2 wudagang0123 的帖子

同理,再帖部分client代码上来瞅瞅

论坛徽章:
0
4 [报告]
发表于 2009-06-02 11:52 |只看该作者
写已经关闭的socket会得到SIGPIPE,也就是broken pipe.
当然应该在第二次写的时候才会有SIGPIPE了,第一次写会得到一个RST,通知你socket已经不可用了,再写的话就是SIGPIPE了。
如果你第一次写就broken pipe,那才奇怪呢

建议你看看UNP,这个问题与python无关,和client无关,tcp就是这么规定的,c的实现也是这样的.

论坛徽章:
0
5 [报告]
发表于 2009-06-02 18:06 |只看该作者
但从运行的结果来看,第一次写是成功了,也并没有发生rst啊

论坛徽章:
0
6 [报告]
发表于 2009-06-04 21:52 |只看该作者
这个....
不好意思,开始没看输出
如果是RST,返回值应该是负的吧?
要不你把两边的代码发上来,我来调调

论坛徽章:
0
7 [报告]
发表于 2009-06-09 15:41 |只看该作者
server.py
import socket,time
port = 5000

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_socket.bind(("", port))
server_socket.listen(5)

bufsize = 4096
while True:
    print 'accept'
    sock,address = server_socket.accept()
    data = sock.recv(bufsize)
    while data != '':
        print data
        print 'r'
        data = sock.recv(bufsize)
        print 'e:data:%s' % data
    print 'sock closed by peer'
    print 'write'
    a = 0
    string = 'nihao,client'
    while True:
        a += sock.send(string)
        print 'write finish: %d' % a


client.py
import socket,sys,time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost',int(sys.argv[1])))
client_socket.send(sys.argv[2])

#client_socket.shutdown(2)
client_socket.close()
time.sleep(1000)


客户端必须是先调用close,所以无法从客户端来验证server第一次写是否是真正的写成功,但是server send的返回值来看,确实是写成功了的

[ 本帖最后由 tianqio 于 2009-6-9 15:43 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-06-09 17:09 |只看该作者
server监听5000端口
当client调用close,但server没有发送数据前,二者的状态如下:

tcp        0      0 localhost.localdomain:43216 localhost.localdomain:5000  FIN_WAIT2   
tcp        0      0 localhost.localdomain:5000  localhost.localdomain:43216 CLOSE_WAIT


当socket处于close_wait状态时,如果发送的不是FIN,ACK 包,对端会是什么响应?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP