我写的一个SOCKET的程序,客户端CONNECT这个函数有的时候不能成功。SOCKET服务程序正常,网络正常。会是什么原因呢?
附程序源码:SOCKET客户端:
SOCKET  s = 0;
struct  sockaddr_in address;
WSADATA  wsaData;
int nStatus;
unsigned long ulAddress;
int nPort = atoi(szPort);
if (!nPort) nPort = SOCK_PORT; nStatus = WSAStartup(0x101, &wsaData);
if (nStatus != 0)
return WriteSocketErrLog(1, szSend); if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1)
return WriteSocketErrLog(2, szSend); s = socket(AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
return WriteSocketErrLog(3, szSend); ulAddress = inet_addr (szAddr);
memset((void*)(&address), 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_port = nPort;
address.sin_addr.s_addr = ulAddress; if (connect(s, (struct sockaddr*)&address, sizeof(address)) == SOCKET_ERROR)
return WriteSocketErrLog(4, szSend); char szMessage[1024]; char szLocalName[255];
char szLocalIP[80];
PHOSTENT hostinfo; if( gethostname ( szLocalName, sizeof(szLocalName)) == 0 )
{
if((hostinfo = gethostbyname(szLocalName)) != NULL)
{
strcpy(szLocalIP, inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list));
}
} if (GetSendString(szSend, szMessage, bSendName, szLocalName, szLocalIP) > 1024)
        return WriteSocketErrLog(6, szSend); if (send(s, szMessage, strlen(szMessage), 0) == SOCKET_ERROR)
return WriteSocketErrLog(5, szSend); closesocket(s);
WSACleanup();
return 0;

解决方案 »

  1.   

    是否是因为没有bind,试试下面的方法:sockaddr_in addr;

    m_scSocket = socket( AF_INET, SOCK_STREAM, 0 );
    if( m_scSocket == INVALID_SOCKET )
    {
    m_iError = 3; //不能建立套接字!
    return FALSE;
    }addr.sin_family = AF_INET;
    addr.sin_port   = htons( u16Port );
    addr.sin_addr.s_addr = htonl( INADDR_ANY );if( bind( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
    {
    closesocket( m_scSocket );
    m_iError = 4; //不能进行绑定!
    return FALSE;
    }addr.sin_family = AF_INET;
    addr.sin_port   = htons( u16Port );
    addr.sin_addr.s_addr = inet_addr( szIPAddr );if( connect( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
    {
    m_iError = 9; //不能进行连接!
    return FALSE;
    }
    return TRUE;
      

  2.   

    是否是因为没有bind,试试下面的方法:sockaddr_in addr;

    m_scSocket = socket( AF_INET, SOCK_STREAM, 0 );
    if( m_scSocket == INVALID_SOCKET )
    {
    m_iError = 3; //不能建立套接字!
    return FALSE;
    }addr.sin_family = AF_INET;
    addr.sin_port   = htons( u16Port );
    addr.sin_addr.s_addr = htonl( INADDR_ANY );if( bind( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
    {
    closesocket( m_scSocket );
    m_iError = 4; //不能进行绑定!
    return FALSE;
    }addr.sin_family = AF_INET;
    addr.sin_port   = htons( u16Port );
    addr.sin_addr.s_addr = inet_addr( szIPAddr );if( connect( m_scSocket, (LPSOCKADDR)&addr, sizeof(addr) ) == SOCKET_ERROR )
    {
    m_iError = 9; //不能进行连接!
    return FALSE;
    }
    return TRUE;
      

  3.   

    connect不成功时返回的错误值是多少?
      

  4.   

    谢谢,我先试试BIND,再把错误值找出来。
      

  5.   

    address.sin_port = htons(nPort);
      

  6.   

    同意ancienttale另外,你可看看是哪一步出错,
    再根据错误信息,浏览MSDN。
      

  7.   

    address.sin_port = nPort;
    address.sin_addr.s_addr = ulAddress;端口和IP地址都要用函数转换的
      

  8.   

    谢谢 ancienttale(voidman)、snsins(不再信仰,不再坚持)。不过我的问题不是所有的消息都收不到,而是个别的收不到,绝大多数都是好的。我做的一个服务程序,24小时运行,每天收不到的也只有几个到几十个消息。
      

  9.   

    阿?
    是不是和TCP的流模式有关?
    一次收下了2个包,你以为只收到一个...