繁体   English   中英

套接字错误-使用python进行简单的套接字编程

[英]Socket error - with simple socket programming using python

我的机器在端口8000上侦听了一个服务器进程。而且,一个客户端进程正在尝试与服务器进行连续通信。 每当它打开一个新的套接字连接并出于某种原因关闭该连接时。 这是一个连续的过程。 但是,当我尝试使用此处粘贴的代码时,经过一定的限制后,我无法创建套接字连接。 在我的Windows计算机中,创建/关闭16k连接后,它将引发错误。

运行此处给出的示例代码时出现10055错误。 “连接失败。错误代码:10055消息由于系统缺少足够的缓冲区空间或队列已满,无法在套接字上执行操作”

import socket              
import sys
from time import sleep


HOST = socket.gethostbyname(socket.gethostname())
PORT = 8000               
open = 0
close = 0

def connect(host, port, message=None):
    global open
    global close
    open += 1

    s = socket.socket()
#     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    print 'Socket created'
    try:
        s.connect((host, port))
    except socket.error , msg:
        print "open count=%s" % open
        print "close count=%s" % close
        print 'Connect failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
        sys.exit()
    print "Sending a msg"

    s.sendall('Hello\n') #send only takes string

    count = 1
    while True:
        data = s.recv(1024)
        print "RECE data:<%s>" % data
        if not data and count < 5:
            print "Wait for data..." 
            count += 1
        else:
            break

    s.shutdown(1)
    s.close()
    del s
    close += 1
    print 'Socket connect complete for %s:%s' % (host, port)

while 1:
    print 'Connected with ',  HOST
    connect(HOST, 8000)
    print "Wait for 1 sec"
    sleep(1)

output like this:
>>>
:
:
Wait for 1 sec
Connected with  <server-ip>
Socket created
Sending a msg
RECE data:<Got your msg: <Hello>
>
Socket connect complete for <server-ip:port>

Wait for 1 sec
Socket created <server-ip>
### open count=16338
### close count=16337
Connect failed. Error Code : 10055 Message An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full
<<<

Windows套接字的问题在于,除非您告诉它们,否则在关闭它们时它们实际上不会死。 初始化套接字后,尝试添加以下代码,看看会发生什么。

l_onoff = 1
l_linger = 0
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, 
                 struct.pack('ii', l_onoff, l_linger))

可以在MSDN上找到有关Lingering的文档。

还将您的关机更改为:

s.shutdown(socket.SHUT_RDWR)

如果Windows表现良好,则应立即关闭所有连接。 这将防止由于套接字过多而导致的缓冲区错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM