void CSocketView::OnInitialUpdate() 
{
CView::OnInitialUpdate();
WSADATA wsd;
WSAStartup(0x0101,&wsd);

CBlockingSocket zc;
CSockAddr zc_addr(INADDR_ANY,80);
zc.Create();
zc.Bind(zc_addr);
zc.Listen();
AfxBeginThread(SeverZcThread,GetSafeHwnd());
}UINT SeverZcThread(LPVOID P)
{
CSockAddr zc_addr;
CBlockingSocket zc;
char request[200];
AfxMessageBox("zhun bei le...");
if(g_sListen.Accept(zc,zc_addr))   //这里下边的代码都不晒我...
{
AfxBeginThread(SeverZcThread,P);
g_sListen.Receive(request,200,10);
//g_sListen.Send("Hello Socket!",13,13);
CDC *pDC;
pDC->TextOut(0,0,request);
AfxMessageBox("jie shou le...");
}

AfxMessageBox("shi bai le...");
return 0;}
CString g_strSeverName="localhost";void CSocketView::OnSocketClient() 
{
CBlockingSocket zcClient;
char *buffer=new char[100];
int nBytes=0;
CSockAddr saSever,saClient;
zcClient.Create();
saSever=CBlockingSocket::GetHostByName(g_strSeverName,80);
zcClient.Connect(saSever);
zcClient.Send("Hello",5,5);
zcClient.Close();
AfxMessageBox("fa shong le..");
}
运行一直出现问题, 便是书山说if(g_sListen.Accept(zc,zc_addr))的地方会等待客户端的连接,可是每次运行直接就是执行了它下边的AfxMessageBox("shi bai le...");为什么我的客户端连接不上我的Sever? 求改代码

解决方案 »

  1.   

    在你的AfxBeginThread(SeverZcThread,GetSafeHwnd());里把SOCKET对象当参数传递给线程
      

  2.   

    AfxBeginThread(SeverZcThread,(LPVOID)zc);UINT SeverZcThread(LPVOID lparam)
    {
       CBlockingSocket m_socket=(CBlockingSocket)lparam;
      

  3.   

    完全傻眼了....-_-#....老鸟的意思是要我把SeverThread改成:
    UINT SeverZcThread(LPVOID P)
    {
             CBlockingSocket m_socket=(CBlockingSocket)lparam;//
    CSockAddr zc_addr;
    CBlockingSocket zc;
    char request[200];
    AfxMessageBox("zhun bei le...");
    if(g_sListen.Accept(zc,zc_addr))   //这里下边的代码都不晒我...
    {
    AfxBeginThread(SeverZcThread,m_socket);//
    g_sListen.Receive(request,200,10);
    //g_sListen.Send("Hello Socket!",13,13);
    CDC *pDC;
    pDC->TextOut(0,0,request);
    AfxMessageBox("jie shou le...");
    }

    AfxMessageBox("shi bai le...");
    return 0;}这样的吗? 可是CBlockingSocket m_socket=(CBlockingSocket)lparam;会报错....
      

  4.   

    我理解laiyiling的意思:
    void CSocketView::OnInitialUpdate() 
    {
    CView::OnInitialUpdate();
    WSADATA wsd;
    WSAStartup(0x0101,&wsd);

    CBlockingSocket zc;
    CSockAddr zc_addr(INADDR_ANY,80);
    zc.Create();
    zc.Bind(zc_addr);
    zc.Listen();
    AfxBeginThread(SeverZcThread,(LPVOID)zc);
    }UINT SeverZcThread(LPVOID lparam)
    {
    CSockAddr zc_addr;
    CBlockingSocket m_socket=(CBlockingSocket)lparam;
    char request[200];
    AfxMessageBox("zhun bei le...");
    if(g_sListen.Accept(m_socket,zc_addr))   //这里下边的代码都不晒我...
    {
    AfxBeginThread(SeverZcThread,m_socket);
    g_sListen.Receive(request,200,10);
    //g_sListen.Send("Hello Socket!",13,13);
    CDC *pDC;
    pDC->TextOut(0,0,request);
    AfxMessageBox("jie shou le...");
    }

    AfxMessageBox("shi bai le...");
    return 0;}
    CString g_strSeverName="localhost";void CSocketView::OnSocketClient() 
    {
    CBlockingSocket zcClient;
    char *buffer=new char[100];
    int nBytes=0;
    CSockAddr saSever,saClient;
    zcClient.Create();
    saSever=CBlockingSocket::GetHostByName(g_strSeverName,80);
    zcClient.Connect(saSever);
    zcClient.Send("Hello",5,5);
    zcClient.Close();
    AfxMessageBox("fa shong le..");
    }另外为什么重复定义zc_addr,我觉的这也应用参数传递到线程.
      

  5.   

    哦...我想我需要再说明一下现在情况...我的SeverThread可以运行..但是到了
             CSockAddr zc_addr;
    CBlockingSocket zc;
    char request[200];
    AfxMessageBox("zhun bei le...");
    if(g_sListen.Accept(zc,zc_addr))// 这里下边的代码却永远不被执行..
                {}CBlockingSocket m_socket=(CBlockingSocket)lparam;我这里会报错
    'lparam' : undeclared identifier
    AfxBeginThread(SeverZcThread,(LPVOID)zc);
    ....同样....麻烦各位老鸟了!!
      

  6.   

    你可以看看这个:
    http://www.codeproject.com/internet/chessserver.asp
    http://www.codeproject.com/internet/serversocket.asp
      

  7.   

    g_sListen是什麽類型的變量阿,CSocket的嗎?爲什麽不用原始套接字呢?是不是申明這個變量的類不阻塞的等待accept就返回了,你讓程序運行到
                       AfxBeginThread(SeverZcThread,m_socket);//
    g_sListen.Receive(request,200,10);
    看看它會不會運行到這個地方,如果你的if(g_sListen.Accept(m_socket,zc_addr))   語句中的g_sListen.Accept(m_socket,zc_addr)  返回false,你又怎麽能指望下面的代碼能得到執行呢? 
    CBlockingSocket m_socket=(CBlockingSocket)lparam;我这里会报错
    'lparam' : undeclared identifier
    爲什麽會出現這個錯誤呢,你的代碼好像寫的是
    UINT SeverZcThread(LPVOID P)
    {'lparam' 當然沒定義了,應該寫成CBlockingSocket m_socket=(CBlockingSocket)P;
      

  8.   

    爲什麽不把accept和receive分開呢,單獨一個綫程循環監聽,每當有客戶端連接的時候就新建一個SeverZcThread,SeverZcThread專門處理接受客戶端發送的消息
      

  9.   

    兄台说的极是!!可是只是if(g_sListen.Accept(m_socket,zc_addr))   它只返回FALSE...所以才头痛...这样的话完全无法接收哇...
      

  10.   

    'lparam' 當然沒定義了,應該寫成CBlockingSocket m_socket=(CBlockingSocket)P;它提示: type cast' : cannot convert from 'void *' to 'class CBlockingSocket'我倒...