在一个线程函数里accept,结果并不阻塞,怎么回事?

解决方案 »

  1.   

    是不是你生成的不是阻塞的socket?
      

  2.   

    socket() function 的参数决定了阻塞与否, 你设置成什么了??
      

  3.   

    socket()的参数决定阻塞与否?不对吧serverFD = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct sockaddr_in server; server.sin_family = AF_INET;
    server.sin_port = htons(19999);
    server.sin_addr.s_addr=ADDR_ANY;
    int ret=bind(serverFD,(sockaddr *)&server,sizeof(server));
    ret=listen(serverFD,4);
    int iSize = sizeof(server); SOCKET clientFD=accept(serverFD,(sockaddr *)&server,&iSize);结果正常情况下阻塞,放到线程函数里就不阻塞了
      

  4.   

    UINT ThreadProc(LPVOID pPara)
    { Info *fo;
    fo = (Info*)pPara; int nSize = sizeof(fo->server); SOCKET s = accept(fo->s, (sockaddr*) &fo->server,&nSize); char buffer[100];
    ZeroMemory(buffer,100); recv(s, buffer,100,0);
    AfxMessageBox(buffer);
    return 0;
    }void CSockThreadDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here WSADATA wsa;
    WSAStartup(MAKEWORD(2,2), &wsa);

    SOCKET saServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("172.29.90.96");
    server.sin_port = htons(17777);

    int iResult = bind(saServer, (sockaddr*)&server,sizeof(server));
    iResult = listen(saServer,5); Info fo;
    fo.s = saServer;
    fo.server = server; AfxBeginThread(ThreadProc,&server);

    }一按下BUTTON1,就弹出一个消息框,消息框内容是空白,按道理应该在线程函数里阻塞,等到有客户端连接上来后发送了消息才会弹出对话框,
      

  5.   

    typedef struct Info
    {
    SOCKET s;
    struct sockaddr_in server;
    };
      

  6.   

    Info fo;
    你的这个定义是局部的,等到线程中后,那个地址中的数据已经不存在了,建议把fo写成类成员,或是全局变量。
      

  7.   

    AfxBeginThread(ThreadProc,&server);??
    AfxBeginThread(ThreadProc,&fo);
    因为在线程函数中:
    Info *fo;
    fo = (Info*)pPara;
      

  8.   

    FAINT
    是我自己代码写错了应该是
    AfxBeginThread(ThreadProc,&fo);搞定