我每次只有第一次才能收到信息,第二次就显不出来
客户端
static DWORD WINAPI ThreadProc(LPVOID param)
{
CClientView *pClientView=(CClientView *)param;
int Status;
WORD wVersionRequested;
WSADATA wsaData;

wVersionRequested = MAKEWORD( 2, 2 );

Status = WSAStartup(wVersionRequested,&wsaData);
if (Status != 0)
{
AfxMessageBox("初始化失败!");
PostQuitMessage(0);
return 0;

}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
AfxMessageBox("建立Client Socket失败!");
PostQuitMessage(0);
return 0;

}
pClientView->client.sin_family=AF_INET;
pClientView->client.sin_addr.S_un.S_addr=inet_addr("192.168.0.21");
pClientView->client.sin_port=htons(1200);
if(connect(s,(struct sockaddr FAR *)&pClientView->client,sizeof(pClientView->client)))
{
AfxMessageBox("建立连接失败!");
closesocket(s);
PostQuitMessage(0);
return 0;
}

AfxMessageBox("建立连接成功!!");
return 0;

}void CClientView::OnViewConnect() 
{
hThread = CreateThread(NULL,0,ThreadProc,(LPVOID)this,0,&ThreadID);

}void CClientView::OnViewSend() 
{
int slength;
slength=send(s,buffer,20,MSG_DONTROUTE);
if(slength!=20||slength==SOCKET_ERROR)
{
int errs=WSAGetLastError();
AfxMessageBox(_T("发送消息失败"));
}

}
以下是服务器端
static DWORD WINAPI ThreadProc(LPVOID param)
{ SOCKET sTempSocket;
int nAddrLength=sizeof(server);
sTempSocket=accept(s,(LPSOCKADDR)&server,&nAddrLength);
if(sTempSocket==INVALID_SOCKET)
{
closesocket(s);
sTempSocket=NULL;
AfxMessageBox("接收初始化失败!");
}
AfxBeginThread((AFX_THREADPROC)ThreadProc,NULL,THREAD_PRIORITY_NORMAL,0,0,NULL);

if(recv(sTempSocket,buffer,20,MSG_PEEK)==SOCKET_ERROR)
{
AfxMessageBox("接收数据失败!");
}
AfxMessageBox(buffer);
return 0;
} CMainFrame::~CMainFrame()
{
}int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;      // fail to create
} if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
  sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;      // fail to create
} // TODO: Delete these three lines if you don't want the toolbar to
//  be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); int Status;
WORD wVersionRequested;
WSADATA wsaData;

wVersionRequested = MAKEWORD( 2, 2 );

Status = WSAStartup(wVersionRequested,&wsaData);
if (Status != 0)
{
AfxMessageBox("初始化失败!");
PostQuitMessage(0);
return 0;

}
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
AfxMessageBox("建立Server Socket失败!");
PostQuitMessage(0);
return 0;

}
server.sin_family=AF_INET;
server.sin_addr.S_un.S_addr=INADDR_ANY;
server.sin_port=htons(1200);
int ret=0;
ret=bind(s,(LPSOCKADDR)&server,sizeof(server));
if(ret==SOCKET_ERROR)
{
closesocket(s);
AfxMessageBox("Bind Error");
return 0;
} int nRet;
nRet=listen(s,2);
if(nRet==SOCKET_ERROR)
{
closesocket(s);
AfxMessageBox("监听错误!");
return 0;
}
AfxBeginThread((AFX_THREADPROC)ThreadProc,(LPVOID)this,THREAD_PRIORITY_NORMAL,0,0,NULL);

return 0;
}

解决方案 »

  1.   

    你也没有加循环,当然直接收一次了。
    建议在static DWORD WINAPI ThreadProc(LPVOID param)函数里的recv()部分改成:
    while(1)
    {
           if(recv(sTempSocket,buffer,20,MSG_PEEK)==SOCKET_ERROR)
           {
    AfxMessageBox("接收数据失败!");
             break;
           }
           AfxMessageBox(buffer);
    }
      

  2.   

    你这样会是一个死循环,但给了我一些启示,最后也解决了,关键在于一是循环,二是MSG_PEEK改为0
    while (TRUE)
    {
    nRet = recv(sTempSocket, buffer, 20, 0);
    if(nRet==SOCKET_ERROR)
    {
    AfxMessageBox("接收数据失败!");
    break;
    }
    else if (nRet!=0)
    AfxMessageBox(buffer);
    }