首页
社区
课程
招聘
[求助]为啥子我的程序会死在accept函数呢?
发表于: 2010-1-15 01:51 5381

[求助]为啥子我的程序会死在accept函数呢?

2010-1-15 01:51
5381
最近在写聊天程序, 写了个服务端, 好不容易把程序调通了, 可运行结果却让我非常纠结... 有些想不明白, 还希望哪位大侠出来指教指教小弟... 先谢谢了, 下面是源码:
LRESULT CALLBACK ChatRoomServer(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{       
   switch(message)
    {
       case WM_INITDIALOG:
              hListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ;
        if (hListenSocket == INVALID_SOCKET)
        {
           MessageBox(hDlg, TEXT("Can't Create Socket"), NULL, MB_OK);
           WSACleanup();
           return FALSE;
        }               
        return TRUE;
               
      case WM_COMMAND:
             switch (LOWORD(wParam))
        {
           case IDC_START:
                   EnableWindow(GetDlgItem(hDlg, IDC_START), FALSE) ;
                   SAddr.sin_family = AF_INET ;
                   SAddr.sin_addr.s_addr = htonl(INADDR_ANY);
                   SAddr.sin_port = htons(TCP_PORT) ;
                   if (bind(hListenSocket, (SOCKADDR*)&SAddr, sizeof(SAddr)))
                {
                MessageBox(hDlg, TEXT("绑定端口失败!!!"), NULL, MB_OK) ;
                break ;
                }
                  else
                MessageBox(hDlg, TEXT("绑定端口成功"), NULL, MB_OK) ;
               
                                listen(hListenSocket, 5) ;
                while (TRUE)
                {
        MessageBox(hDlg, TEXT("accept函数调用开始..."), NULL, MB_OK) ;
        ServerSocket = accept(hListenSocket, NULL, 0)  ;
        MessageBox(hDlg, TEXT("accept函数调用结束..."), NULL, MB_OK) ;
        if (ServerSocket == INVALID_SOCKET)
          {
             MessageBox(hDlg, TEXT("accept函数调用失败..."), NULL, MB_OK) ;
             break ;
           }
        else
        {
              MessageBox(hDlg, TEXT("创建一个线程"), NULL, MB_OK) ;
              HANDLE  hThread = CreateThread(NULL, 0                       ,ServiceThread,  ( PVOID)  &ServerSocket, NULL, &ThreadID) ;  
                                        Count = Count + 1 ;
               SetDlgItemText(hDlg, IDC_STATIC, _T("成功创建线程")) ;
               CloseHandle(hThread) ;
        }
                        }//while循环结束
        closesocket(hListenSocket) ;
                        return TRUE;
        case IDC_EXIT:
                F_STOP = 1 ;
                WSACleanup();
                EndDialog(hDlg, LOWORD(wParam)) ;
               return TRUE;
                }
            break;
        }
        return FALSE;
}
然后程序将MessageBox(hDlg, TEXT("accept函数调用开始..."), NULL, MB_OK) ;执行后进入accept函数建立链接, 虽然accept()函数只有连接成功的时候才会返回, 但是应该也不至于使应用程序没有响应吧... 所以就想不明白了
ServerSocket = accept(hListenSocket, NULL, 0)  ;
程序未执行到这一句MessageBox(hDlg, TEXT("accept函数调用结束..."), NULL, MB_OK) ;

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
开一个线程用来连接。

照你所说accept 是等待模式 也就是所谓的阻塞模式
google 非阻塞 accept
2010-1-15 02:59
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
呵呵, 谢谢啦, 已经通过创建一个线程执行accept解决了
2010-1-15 13:06
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非阻塞的化 恐怕要用select来最监视了
2010-1-15 13:21
0
游客
登录 | 注册 方可回帖
返回
//