9

Mac OSX環境でソケットプログラミングを使用してサンプルを作成するためのチュートリアルhttp://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-serverをフォローしています。

私はreactor.listenTCP(80、factory)のpost80を使用して書いています。server.pyファイルを実行すると、エラーが発生します。

File "server.py", line 10, in <module>
    reactor.listenTCP(6, factory)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/posixbase.py", line 436, in listenTCP
    p.startListening()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/twisted/internet/tcp.py", line 641, in startListening
    raise CannotListenError, (self.interface, self.port, le)
twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 48] Address already in use.

ソースコードは次のとおりです。

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class IphoneChat(Protocol):
    def connectionMade(self):
        self.factory.clients.append(self)
        print "clients are ", self.factory.clients

    def connectionLost(self, reason):
        self.factory.clients.remove(self)

factory = Factory()
factory.protocol = IphoneChat
factory.clients = []
reactor.listenTCP(80, factory)
print "Iphone Chat server started"
reactor.run()

6などの別のポートを使用している場合は、正常に機能しています。同じアプリケーションでポート80を使用するにはどうすればよいか知りたかっただけです。

4

4 に答える 4

7

実際、私もこの問題に遭遇しました。

これが私がしたことです:

MacBook-Air:Desktop user$ sudo lsof -i:80
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Python  1276 root    3u  IPv4 ******      0t0  TCP *:http (LISTEN)
MacBook-Air:Desktop user$ sudo kill 1276
MacBook-Air:Desktop user$ sudo python server.py 
Iphone Chat server started

その後、すべてがうまくいきます。

于 2014-08-06T14:59:29.910 に答える
5

私にとっての問題は、Apacheがすでにポート80でリッスンしていたことです。多くの人がこの投稿やこの問題を抱えた他の投稿をグーグルで検索しているようですが、この特定の回答が提供されているとは思いません。Mac/Mavericks を実行していますが、Apache がデフォルトで実行されている他のシステムで問題が発生するか、実行されていることを忘れる可能性があります。

やりました

sudo lsof -i TCP:80 | grep LISTEN

手に入れた

httpd      20 root    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
httpd     109 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
httpd     437 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
httpd     438 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)
httpd     439 _www    4u  IPv6 0x1d12a12e12345b12      0t0  TCP *:http (LISTEN)

やりました

sudo apachectl stop

その後、サーバーはポート 80 で問題なく動作しました。

于 2014-03-23T14:15:43.487 に答える
3

別のアプリケーションがすでにソケットをこのポートにバインドしている場合、ポートをリッスンすることはできません。たとえば、socket.bindを読む

于 2013-02-01T07:43:41.057 に答える