我有这个代码。(在我的其他旧项目中使用它,效果很好)
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 项目,我注意到该过程没有建立任何连接,而是在调用 connect 后挂起。然后我切换到 C/C++ 并尝试使用这个做同样事情的代码。在它挂起之后,就没有办法杀死它了(除非在调试它时我不得不退出调试器)。TaskManager,Process Explorer 没有做任何事情。
没有线程或循环或任何可能导致它挂起的代码和另一个在连接后写入套接字的函数。
使用 Visual Studio 进行调试时,一段时间后会出现一条消息(如下)
甚至 Wireshark 也没有显示任何内容。重新启动我的电脑,仍然是同样的问题。
那么以前有人遇到过这个问题吗?
使用的编译器
- 视觉工作室 2010
- 佩莱斯-C
- 德尔福 7
操作系统:Windows 7 64 位,旗舰版
温索克版本:2.2
更新:
所以我想我会逃跑并切换到Java,只是在几次之后才发现同样的问题。这到底是怎么回事。即使在 localhost 上,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: //flatassembler.net/examples/quetannon.zip
所以现在我不得不重写976行JAVA汇编就因为这个?帮帮我这里的人。