client端,HRESULT CPeeperThread::OnMsgConnect(WPARAM, LPARAM)
{
BOOL bRet = FALSE;
do
{
bRet = ::PL_InitSocket();
if(!bRet)
{
break ;
} if(!m_pPeeperWnd)
{
bRet = FALSE;
break ;
}
int nRet = 0;
sockaddr_in addr;
hostent* pEnt = NULL;

m_pPeeperWnd->m_sckClient[0] = ::socket(AF_INET, SOCK_STREAM, 0);
m_pPeeperWnd->m_sckClient[1] = ::socket(AF_INET, SOCK_STREAM, 0);
TRACE(_T("Client Socket 0 and 1:%d, %d.\n"), 
m_pPeeperWnd->m_sckClient[0], m_pPeeperWnd->m_sckClient[1]);
if(m_pPeeperWnd->m_sckClient[0] == INVALID_SOCKET ||
m_pPeeperWnd->m_sckClient[1] == INVALID_SOCKET)
{
bRet = FALSE;
break ;
} pEnt = ::gethostbyname(m_pPeeperWnd->m_strIP);
if(!pEnt)
{
bRet = FALSE;
break ;
}
addr.sin_family = AF_INET;
addr.sin_port = ::htons((u_short)(m_pPeeperWnd->m_uPort));
addr.sin_addr.S_un.S_un_b.s_b1 = pEnt->h_addr_list[0][0];
addr.sin_addr.S_un.S_un_b.s_b2 = pEnt->h_addr_list[0][1];
addr.sin_addr.S_un.S_un_b.s_b3 = pEnt->h_addr_list[0][2];
addr.sin_addr.S_un.S_un_b.s_b4 = pEnt->h_addr_list[0][3];

bRet = FALSE; // default
for(int i = 0; i < 3; i ++)
{
int nRet1 = ::connect(m_pPeeperWnd->m_sckClient[0], 
(sockaddr*)&addr, sizeof(addr));
if(nRet1 != SOCKET_ERROR)
{
BYTE chData[5];
ZeroMemory(chData, 5);
::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0], chData, 5, NULL);
}
else
{
TRACE(_T("Socket Error Code = %d.\n"), ::WSAGetLastError());
}
TRACE(_T("Client[0] is: %s.\n"), (nRet1 == 0)?_T("Ok"):_T("Failed."));
int nRet2 = ::connect(m_pPeeperWnd->m_sckClient[1], 
(sockaddr*)&addr, sizeof(addr));
if(nRet2 == SOCKET_ERROR)
{
TRACE(_T("Socket Error Code = %d.\n"), ::WSAGetLastError());
} TRACE(_T("Client[1] is: %s.\n"), (nRet2 == 0)?_T("Ok"):_T("Failed."));
if(nRet1 == SOCKET_ERROR ||
nRet2 == SOCKET_ERROR)
{
Sleep(2000);
continue ;
} char chConnectInfo[512];
ZeroMemory(chConnectInfo, 512);
int nRet = ::PL_ReadSocketData(m_pPeeperWnd->m_sckClient[0], 
(BYTE *)chConnectInfo, 512, NULL);
m_pPeeperWnd->SetConnectInfo(chConnectInfo); bRet = TRUE; // Connect Ok!
break ;
}
}while(0); if(m_pPeeperWnd)
{
DWORD dwFlag = PL_PEEPER_NOTIFY_DISCONNECT;
if(bRet)
{
dwFlag = PL_PEEPER_NOTIFY_CONNECT;
}
::SendMessage(m_pPeeperWnd->GetSafeHwnd(), 
PL_CONNECT_MESSAGE, (WPARAM)PL_CONNECT_MESSAGE, (LPARAM)dwFlag);
} return bRet ? S_OK : E_FAIL;
}

解决方案 »

  1.   

    SOCKET  m_sckClient[2]; //客户端Socket
      

  2.   

    dongfa,你放假了吗?昨天还看见你的。
      

  3.   

    这明明是两个端口啊.
    用socket创建的套接字如果不bind到特定的端口,是由系统给一个随机的端口.
    这程序里是用两个端口连接一个服务器.
    但肯定是两个端口,相同的IP地址.m_sckClient[0],m_sckClient[1].
    你跟踪一下就知道了.
      

  4.   

    看server端代码:
    m_sckServer = socket(AF_INET, SOCK_STREAM, 0);
    if(m_sckServer != INVALID_SOCKET)
    {
    pEnt = ::gethostbyname(chName);
    if(pEnt)
    {
    addr.sin_family = AF_INET;
    addr.sin_port = htons(m_uPort);
    addr.sin_addr.s_addr = INADDR_ANY; nRet = ::bind(m_sckServer, (sockaddr*)&addr, sizeof(addr));

    if(nRet != SOCKET_ERROR)
    {
    nRet = ::listen(m_sckServer, SOMAXCONN);
    if(nRet != SOCKET_ERROR)
    {
    addrlen = sizeof(addr);
    TRACE(_T("开始了服务,等待客户......\n"));
    m_sckClient[0] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
    if(m_sckClient[0] != INVALID_SOCKET)
    {
    //为了同步
    ::PL_SendSocketData(m_sckClient[0], NULL, 0, PL_TEMP, MSG_OOB);
    }
    m_sckClient[1] = ::accept(m_sckServer, (sockaddr*)&addr, &addrlen);
    if(m_sckClient[0] != INVALID_SOCKET &&
       m_sckClient[1] != INVALID_SOCKET)
      

  5.   

    dongfa(阿东),有没有流程图呀,我另外开贴子,你能不能给我发到e-mail里面。[email protected],多谢了。
      

  6.   

    现在没有,我以后做了再发给你吧。
    最近我们工作上也挺忙的,而且当时也只是写着玩的,有一些BUG也没有改,而且有一定的局限性(服务器端不能在另一局域网内)。以后我会把peeper重新整理一下,换一种方法来做。希望你能多提意见!先谢了!