我用delphi调用我用VC写的一个scoket连接的dll函数库,当不执行这句时一切正常,socket连接可以正常释放,但当执行了adoconnection1.Connected :=true;后,socket连接就不能正常释放,我以为是我的delphi6没打补丁,打上sp2后情况依旧。
我写了个很简单的VC的函数,编译成dll用delphi6调用情况也是这样:Vc的代码
extern "C" __declspec(dllexport) int MongateConnect()
{
WSADATA wsaDATA;
SOCKET sock;
char buf[255]="";
int sign_readMSG_cli;
struct sockaddr_in sever = { 0 };
errno=WSAStartup(MAKEWORD(2,0),&wsaDATA);
if(errno!=0){                            
perror("cannot init");
exit(1);}
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET){
//perror("open socket");
WSACleanup();
return -1;
}
sever.sin_family=AF_INET;
sever.sin_addr.S_un.S_addr=inet_addr(“192.168.0.1");
sever.sin_port=htons(1234);
errno=connect(sock,(struct sockaddr*)&sever,sizeof(sever));
if(errno==SOCKET_ERROR){
closesocket(sock);
//perror("connect to sever");
WSACleanup();
return -2;}
sign_readMSG_cli=recv(sock,buf,sizeof(buf),0);
WSACleanup();
closesocket(sock);
return sock;//这里我只是把这个值返回看看,没有实际对它操作
}
如果没用ADO的话每次返回的sock值不同,但用过ado后每次返回的值经常相同,用netstat -na看连接数不断增加,说明关闭后没有释放。

解决方案 »

  1.   

    可能是bug!能力不够,只能帮你顶了!
      

  2.   

    真是晕,只要连接过ADO再执行adoconnection1.Connected := False;都一样了,在建立socket前关闭数据库连接都一样
      

  3.   

    再发现个新问题,我delphi每隔5秒调用一次DLL的函数,每次建立连接和接收信息,完了再断开,有一次我中途故意断开网络,过了半分钟再连上,怪了,从此以建立的连接(不要退出程序)就能马上释放tcp连接了
      

  4.   

    看了N多贴,按理是WSACleanup();在closesocket(sock);的后面,可不知道为什么,不用ADO的时候,WSACleanup();在前面就可马上释放连接。