2011-12-20 29 views
4

以前はPythonでTCPソケットを扱ってきました。 C言語ではかなり似ていますが、動作するものは何も得られません。 socket(AF_INET, SOCK_STREAM, 0);は-1を返しますが、もちろんエラーを示します。どのように私はとても間違って行くことができますか? この問題で私を助けることができればいいですが、シンプルで裸の骨のソースコードを私に提供できるのであれば信じられないほど役に立ちます。実際に何かをする必要はなく、エラーを処理する必要はありません。サーバーソケットを正しく作成し、バインドし、受信し、クライアントを受け入れ、クライアントソケットを作成して接続する方法を確認するだけです。私は自分のすべての鐘と笛を理解することができます。Winsock C TCPソケット

ありがとうございます!

+2

あなたのソケットコールの後に 'WSAGetLastError()'は何を返しますか? – greatwolf

+0

プログラムを実行しているユーザーは、ネットワークを使用する権限を持っていますか? – cHao

+0

WSAGetLastErrorは10093を返し、私は通常、ソケットを使用するPythonで書かれたプログラムを実行します。 –

答えて

8

あなたはソケットを使用する前にWSAStartup機能付きのWinSockを初期化する必要があります。 PythonのWindowsソケット実装は、自動的にこの呼び出しを行う可能性があるので、心配する必要はありませんが、WinSockを直接使用する場合は、他のWinSock呼び出しの前にWSAStartupを呼び出すことが重要です。 WSACleanupに電話してください。

WSAData data; 

if (WSAStartup(MAKEWORD(2, 2), &data) != 0) 
{ 
    // unable to initialise WinSock, time to quit 
} 

// WinSock has been successfully initialised, time to make sockets! 
int s = socket(...); 

// After all WinSock stuff is done, balance out your WSAStartup with a cleanup: 
WSACleanup(); 
+0

WSAStartupの使い方を教えていただきありがとうございます。この種のCプログラミングは私を混乱させる... –

0

おそらく、プロセスにはソケットを作成する権限がない(errno == EACCES)と思われます。

あなたのPythonインタプリタが異なるセキュリティコンテキストを取得している可能性があります。とにかく

、後悔するより優れた安全なので、そこのようなもの置く:Winsockのは、実際にerrnoを設定しますが、それは...

+0

WinsockはCRTの一部ではないため、 'errno'にアクセスすることはできません。しかし、これは 'WSAGetLastError'で取り出せるエラーコードを設定します。 – cHao

+0

それは変です、とにかく 'errno'はどこにでも置けるはずです...(しかし、あなたはいつもMicrosoftのソフトからそのようなものを期待できます) –

+0

それを人間が読めるテキスト文字列に変換する関数はありますか? –

9

は、あなたが他のWinsockを行う前にWSAStartupと呼ばれている必要があります場合

sock = socket(AF_INET, SOCK_STREAM, 0); 
if (sock == -1) { 
     perror("myapp"); 
     exit(1); 
} 

IDKを電話?

+0

彼はほとんどそうしなかった。 +1 – jweyrich

+0

ええと...それはそうだろう... –