SOCKET sockId;
struct sockaddr_in servaddr; sockId = socket(AF_INET,SOCK_STREAM,0);
if(sockId == INVALID_SOCKET)
{
#ifdef _DEBUG
printf("socket error");
#endif
return false;
}
ZeroMemory(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr   = inet_addr(strListenIp.c_str());
servaddr.sin_port = htons(iListenPort);
#ifdef _DEBUG
printf("\nconnectip:%s     connectPort:%d   sockId:%d\n",strListenIp.c_str(),iListenPort,sockId);
#endif
if(connect(sockId,(struct sockaddr *)&servaddr, sizeof(servaddr)) != 0)
{
#ifdef _DEBUG
    printf("\nconnect error");
    printf("\nERROR is %d\n",WSAGetLastError());
#endif
    closesocket(sockId);
    return false;
}
WriteSocketSec(sockId,InObj);
closesocket(sockId);
return true;    程序需要不停的向服务程序侦听的同一端口发送数据,每次发送前都是重新起socket,发送WriteSocketSec()完后关闭socket(closesocket(sockId);).
    在进行较多次后connect出问题,WSAGetLastError()出来的值是10048,即WSAEADDRINUSE,Address already in use。用netstat看,有很多端口没被释放,以前听高手说closesocket关闭端口有一定延时,怀疑是connect时又用了仍为释放完全的端口。
    急等高手给出解决办法。

解决方案 »

  1.   

    关闭端口都有一定的延迟(大概240s左右,这是由其机制决定的,处于TIME_WAIT状态)。closesocket造成端口没被完全释放,可能是因为socket设置了SO_LINGER选项(如关闭时有未发送数据,则逗留)。解决的方法可以有两种:
    1、强行关闭,调用shutdown函数(在closesocket 前);
    2、取消SO_LINGER设置,改为SO_DONTLINGER
      

  2.   

    没有相关的经验,不过听说用closesocket来释放套节字资源的时候容易导致数据的丢失,
    会不会是这个原因造成的有些端口没有释放。听人说可以先在closesocket之前调用一下shutdown()函数来从容中断连接!
    函数原型:
    int shutdown(socket s,int how)
    不知道是不是问题所在,共同进步!!!!
      

  3.   

    我想最好还是用多线程吧因为socket的建立与释放都是需要时间的,可能上次的socket还没有释放掉就开始新建下一个了试试用多线程,上一个线程没有执行完就新开一个线程发送好了
      

  4.   

    可以选调用shutdown,再closesocket
    不过你的设计可能要改一改了。
      

  5.   

    你CONNECT之前,可以自己BIND本地端口,由自己来指定端口而不是由它自己指定.比如,我选择使用 8888 到 9999 的端口,我在程序中用一个int型变量控制就可以了.当然BIND出错时候,要自动向前i++,因为有可能这个区间中某些端口被其他的程序占用了