回 帖 发 新 帖 刷新版面

主题:急求TCP客户端发送中止的问题

用BCB编程,采用TCP Client与对方的TCP Server通讯,每个端口对应一个线程。如果开的线程2个以下,没有什么问题,如果开50个以上,并且通讯条件不太稳定的情况下,运行20分钟后常会有线程中断。跟踪发现好像是在open()或Send()的时候返不回来。现在用的是阻塞模式。轻大家帮忙看看问题何在,如何解决?谢谢!!源代码如下
BOOL TKHTCPComm::Open()
{    

    DWORD dwError;    
    char  szTmp[100] ; 
    hostent*    he;
    int         addr;
    in_addr     in;
    int         i;

    IsOpening = true;
    if( !InitFlag )
    {
        if (WSAStartup(MAKEWORD(2,0),&WSAData) )
        {           
            WSACleanup();  
            return false;
        }
        else
            InitFlag = true ;
    }


    to.sin_family = AF_INET;
    to.sin_port = htons((unsigned short )RemotePort); 
    if(FRemoteHost != "" && FRemoteIP == "127.0.0.1" )
    {
        he = gethostbyname(FRemoteHost.c_str());
        memcpy( &addr, he->h_addr_list[0],sizeof(int));
        to.sin_addr.s_addr = addr  ;
        FRemoteIP = inet_ntoa( to.sin_addr ) ;
    }
    else
        to.sin_addr.s_addr = inet_addr(RemoteIP.c_str()); 
    sockfd=socket(AF_INET,SOCK_STREAM,0);   

    if (sockfd==INVALID_SOCKET)
    {           
            goto    exitfail;
    }

    
    if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char FAR*)&optval,
        sizeof(optval))==SOCKET_ERROR)
    {           
            goto    exitfail;
            closesocket(sockfd);
            return FALSE;
    }    
    ZeroMemory(&server,sizeof(struct sockaddr_in));
    server.sin_family=AF_INET;
    server.sin_port= htons(RemotePort); 
    server.sin_addr.s_addr = inet_addr ( FRemoteIP.c_str() );//TCP

    if( connect( sockfd , (sockaddr*)&server ,sizeof( server ) ) ==-1 )
    { 
            goto    exitfail;
    }

    if( LocalPort == 0 )
    {
        int len1,len = sizeof( server );
        if( len1 = getsockname( sockfd,(sockaddr*)&server,&len))
        {
        }
        LocalPort =  htons( server.sin_port );
    }
    wasEvent = WSACreateEvent();
    if ( WSAEventSelect(sockfd, wasEvent, FD_READ|FD_CLOSE) == SOCKET_ERROR)
    {           
            WSACloseEvent(wasEvent);    
            closesocket(sockfd);
            sockfd = NULL ;  
            return FALSE;
    }
    event[0] =  wasEvent ;
    ConnectFlag = TRUE;
    IsOpening = false;
    Resume();
    Sleep(100);        
    if( Suspended )     Resume();    
    return  true ; 

exitfail:
    try
    {
        i = WSAGetLastError();
        closesocket(sockfd);
    }
    catch(...)
    {
        i = 1;
    }   
    IsOpening = false ;
    ConnectFlag = 0;
    return  false;
}

回复列表 (共1个回复)

沙发

发送的源代码如下:
int TKHTCPComm::Send(char *buf,int len)
{
int r;
DWORD dwError;
hostent*    he;
int         addr;

    r = -1;

    to.sin_family = AF_INET;
    to.sin_port = htons((unsigned short )RemotePort); 
    if(FRemoteHost != "" && FRemoteIP == "127.0.0.1" )
    {
        he = gethostbyname(FRemoteHost.c_str());
        memcpy( &addr, he->h_addr_list[0],sizeof(int));
        to.sin_addr.s_addr = addr  ;
        FRemoteIP = inet_ntoa( to.sin_addr ) ;
    }
    else
        to.sin_addr.s_addr = inet_addr(RemoteIP.c_str()); 

    if (ConnectFlag)
    {
        r = sendto (sockfd, buf, len, 0, (struct sockaddr FAR *)&to, sizeof(SOCKADDR));
        if (r == SOCKET_ERROR)
        {
         dwError = WSAGetLastError();
            Close();
           
        }
    }
    return r;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册