Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:Socket不';我不想关闭()并且setsockopt()被忽略?(调试问题) 编辑_Python_Sockets - Fatal编程技术网

Python:Socket不';我不想关闭()并且setsockopt()被忽略?(调试问题) 编辑

Python:Socket不';我不想关闭()并且setsockopt()被忽略?(调试问题) 编辑,python,sockets,Python,Sockets,最初的问题是关于重新连接的问题(close()和shutdown()混淆)。以下代码为工作代码(固定) 对于谷歌来说,这个脚本是一个IRC机器人。功能列表: 继续重新连接,直到连接可用 如果已取得分配的尼克,则将字符串放在名称后面(重复,直到成功) 听乒乓球,用乒乓球回应 能听到命令并做出反应 如果连接丢失,bot将尝试重新连接(如果没有收到信息,没有PING,在5分钟内,它将连接视为断开连接) 就是这样:) 完整代码: #!/usr/bin/env python # -*- coding:

最初的问题是关于重新连接的问题(close()和shutdown()混淆)。以下代码为工作代码(固定) 对于谷歌来说,这个脚本是一个IRC机器人。功能列表:

  • 继续重新连接,直到连接可用
  • 如果已取得分配的尼克,则将字符串放在名称后面(重复,直到成功)
  • 听乒乓球,用乒乓球回应
  • 能听到命令并做出反应
  • 如果连接丢失,bot将尝试重新连接(如果没有收到信息,没有PING,在5分钟内,它将连接视为断开连接)
就是这样:)

完整代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import socket
import string
import os
import platform
import time

# Variables
HOST = "irc.server.net"
PORT = 6667
NICK = "Nickname"
IDENT = "Nickname"
REALNAME = os.getenv('USER')
CHAN = "##Channel"
readbuffer = ""

# The Connection itself
keep_connecting = True
while keep_connecting:
    irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    irc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    irc.settimeout(300)
    try:
        irc.connect((HOST, PORT))
        pass
    except socket.gaierror:
        print "No connection, attempting to connect again"
        time.sleep(5)
        continue
    print "Sending info..."
    irc.send("NICK %s\r\n" % NICK)
    irc.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
    irc.send("JOIN :%s\r\n" % CHAN)
    # Initial msg to send when bot connects
    irc.send("PRIVMSG %s :%s\r\n" % (CHAN, "TehBot: "+ NICK + " Realname: " + REALNAME + " ."))
    while True:
        try:
            data = irc.recv(4096)
            print data
            # If disconneted from IRC
            if len(data) == 0:
                print "Length of data == 0 ?..."
                break
            # If Nick is in use
            if data.find (NICK + " :Nickname is already in use") != -1:
                NICK = NICK + str(time.time())[5:-3]
                break
            # Ping Pong so we don't get disconnected
            if data[0:4] == "PING":
                irc.send ("PONG " + data.split() [ 1 ] + "\r\n")
        except socket.timeout:
            print "Socket timeout!"
            irc.close()
            break

这很可能是因为您正在关闭wi-fi,并且该接口已从系统中删除,所以您会遇到无法分配请求地址的情况。当您试图绑定到不存在的本地地址时,会出现这样的错误


另一件事是,在调用
close
后,您将无法在同一个套接字上重新连接,因为它会释放与该套接字相关的所有资源。

Hmm,如果我仍然以相同的方式断开连接,您建议我如何重新连接到该套接字?如果以这种方式断开连接,我无法关闭()或关闭()套接字?您始终可以调用
close
,因为它告诉操作系统将其从资源中删除。只要不要调用
shutdown
@Chrules,如果您想在超时后断开连接,为什么要费心接收所有数据而忽略它呢?获取超时后调用
irc.close()
,仅此而已。删除接口后调用
shutdown
也不会有多大帮助,因为您无法将此信息发送到远程。是的,我现在知道了,但由于某些原因,我仍然收到错误消息,即仅使用close()时连接套接字,因此我以前尝试使用shutdown(),以便close()不会只是等待。不知道这是否只是一个不正常的情况,但会尝试再次运行代码:)您可能根本没有调用
close
,因为您会得到一些关于文件描述符的错误(因为调用close后无法再次连接,请在循环开始时移动
irc=socket(…)
)。我怀疑您刚刚从
recv
中获得了空字符串,因此您尝试重新连接(但您也不能这样做;您必须关闭套接字并创建一个新的套接字)。尽量简化一点程序流程。