【问题标题】:Winsock Programming - WsaGetSelectError,Winsock 编程 - WsaGetSelectError,
【发布时间】:2012-12-19 19:12:05
【问题描述】:

我的 Winsock 编程的小问题,我正在尝试将图形界面与在两个客户端之间传递数据的能力集成。

基本上,按下 C 并执行第一段代码,然后我会得到一个“套接字错误”,这是我在此处的第二段代码中的 MsgBox 给出的。

case 'C':
{
    if(!Connected)
    {
        connect(s,(LPSOCKADDR)&me,sa_size);
        break;
    }
}

case WM_SOCKET:
    if (WSAGETSELECTERROR(lParam))
    {
        cout << "Socket error\n";
        WSAGetLastError();
        MessageBox (hwnd,"Socket Error123","Information",MB_OK);
        PostQuitMessage (0);
        return 0;
    }

我真的不知道该尝试什么来解决这个问题,我一直无法找到任何关于将图形界面添加到我目前拥有的网络代码中的帮助(在没有实现图形部分的情况下工作) , 正在寻找我能找到的任何帮助。

【问题讨论】:

  • 您到底遇到了哪个错误?您能否更改代码以从WSAGetLastError 输出错误代码或通过FormatMessage 输出实际错误?
  • 好吧,事实上我没有得到任何错误。它使 MsgBox 出现并且 PostQuitMessage 关闭程序。如果我删除退出功能并保留其他所有内容,程序将继续执行,就像什么都没发生一样。
  • 这并不意味着您没有收到任何错误;出现错误弹出窗口的事实意味着 WSAGETSELECTERROR(lParam) 正在评估为非零,这对我来说听起来像是一个错误。
  • hwnd 0x004105f2 {unused=??? } HWND__ *,未使用的 CXX0030:错误:无法评估表达式,这是我在调试模式下运行并逐步执行每一行时所能找到的所有错误。
  • 我不是在谈论编译错误,我是在谈论运行时错误,特别是导致MessageBox调用发生的一个或多个错误。

标签: c++ networking winsock


【解决方案1】:

Connected 为真时,您的'C' 处理程序缺少break/return 语句,而当WSAGETSELECTERROR() 返回0 时,您的WM_SOCKET 处理程序缺少break/return 语句。

另外,WSAGetLastError()WM_SOCKET 中毫无意义。您必须使用WSAGETSELECTERROR() 报告的错误代码。

试试这个:

case 'C':
{
    if (!Connected)
        connect(s,(LPSOCKADDR)&me,sa_size);
    break;
}

case WM_SOCKET:
    if (WSAGETSELECTERROR(lParam))
    {
        std::cout << "Socket error " << WSAGETSELECTERROR(lParam) << " on Event " << WSAGETSELECTEVENT(lParam) << std::endl;
        MessageBox (hwnd, TEXT("Socket Error"), TEXT("Information"), MB_OK | MB_ICONERROR);
        PostQuitMessage (0);
        return 0;
    }
    break;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多