私はこのコードを持っています。(私の他の古いプロジェクトでそれを使用し、素晴らしく機能しました)
SOCKET Connect(char * host, int port){
struct sockaddr_in sin = {0};
struct hostent * entry = 0;
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET){
return INVALID_SOCKET;
}
entry = gethostbyname(host);
if(entry == 0){
closesocket(s);
return INVALID_SOCKET;
}
sin.sin_addr = *((LPIN_ADDR)*entry->h_addr_list);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
// The process becomes dealocked after this line
if( connect(s,(const LPSOCKADDR)&sin,sizeof(SOCKADDR)) == SOCKET_ERROR){
closesocket(s);
return INVALID_SOCKET;
}
return s;
}
今朝、TTcpClient と Indy の TIdTcpClient ラッパーを使用して Delphi プロジェクトの作業を開始しましたが、プロセスが接続を確立せず、接続を呼び出した後にハングしただけであることに気付きました。次に、C/C++ に切り替えて、同じことを行うこのコードを試しました。ハングした後、それを強制終了する方法はありません (デバッガーを終了しなければならなかった場所でデバッグされている場合を除きます)。TaskManager、Process Explorer はたわごとをしませんでした。
スレッドやループなど、このコードと、接続後にソケットに書き込む別の関数だけをハングさせる可能性のあるものはありません。
Visual Studio でデバッグすると、しばらくするとメッセージが表示されます (以下)。
Wireshark でさえ、何も表示されません。コンピューターを再起動しても、同じ問題が発生します。
では、これまでにこの問題を抱えたことのある人はいますか?
使用コンパイラ
- ビジュアル スタジオ 2010
- ペレス-C
- デルフィ 7
OS : Windows 7 64 ビット、アルティメット
Winsock バージョン: 2.2
アップデート:
だから私は逃げると思ってJavaに切り替え、数回後に同じ問題を見つけました。ここで一体何が間違っているのですか。Java は、ローカルホストでも接続に約 2 分かかります。この単純なコードには約 2 分かかり、その間 java.exe も強制終了できません。
long startTime = System.currentTimeMillis(), endTime;
Socket clientSock = new Socket("localhost",80); // running Apache on localhost
endTime = System.currentTimeMillis();
Log("Connection time " + (endTime - startTime) + " ms");
clientSock.close();
run:
Connection time 125088 ms
Java に関しては、私はいくつかの検索を行いました。この問題は JDK のバージョン 1 のバグでしたが、変更ログはパッチが適用されたことを示していました。しかし、これは基になる winsock ライブラリで発生します。なぜ ?このプログラムは即座に接続し、winsock も使用します: http://flatassemblyr.net/examples/quetannon.zip
では、このためだけに、アセンブリで976行の Java を書き直さなければならないのでしょうか? ここの人々を助けてください。