none
用 VS2010 MFC 套接字SOCKET 在编写TCP/IP通信传输的时候,关闭应用程序或者断开客服端总是会出现389出错,请问怎么修改? RRS feed

  • 问题

  • 程序可以正常运行,并且也可以正常持续的发送数据,但是断开客服端连接或者直接关闭服务端界面,就会立即出现下面断言389错误。

    用 VS2010 MFC 套接字SOCKET 在编写TCP/IP通信传输的时候,会出现389出错,请问怎么改正?

    请问是不是因为关闭监听或者客服端出现了异常?

    如图错误:

    程序如下:

           UINT StartServer(LPVOID lParam)//监听,连接部分的线程
    {
    if(!YNThread)
    {
    pThread=NULL;
    YNThread=false;
    }
    else{
    if (!AfxSocketInit())
    {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return 1;
    }



    CGxSingleCamMonoDlg *aDlg = (CGxSingleCamMonoDlg *)lParam;
    UINT nPort = 9000;

    //socket------------------------------------------------

    if (!aSocket.Socket())
    {

    return 1; 
    }

    BOOL bOptVal = TRUE;
    int bOptLen = sizeof(BOOL);

    aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);


    if (!aSocket.Bind(nPort))
    {

    return 1; 
    }

    if(!aSocket.Listen(10))
    {
    char szError[256] = {0};

    return 1;
    }

      if(!aSocket.Accept(serverSocket))
      {
      m_exit = 1;
      return 1;
      }

      if( m_exit==1)
      {
      serverSocket.Close();//关闭客服端
      aSocket.Close();//关闭监听
      
     
      }



      }

    return 0;
    }

    //发送for循环里面的

    UINT XYshow(LPVOID lParam)//坐标数据显示,该线程在整个工程文件的一个回调函数里面被调用,谢谢
    {

    int m=0,n=0;
    for(int i=8;i<10;i++)
    {
    for(int j=8;j<10;j++)
    {
    m=i;
    n=j;
    ::SetDlgItemInt(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_OX,j,false);//数据显示在界面
    ::SetDlgItemInt(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_OY,i,false);

    OXX=m;
    OYY=n;
    if( m_exit = true)
    {
    CString strX;

    strX.Format("%d",OXX);

    CString strY;

    strY.Format("%d",OYY);

    CString s1,sText1=_T("1");

      s1 = sText1+" "+strX+" "+strY+"\r\n";
      
    if(serverSocket.Send(s1,s1.GetLength())==SOCKET_ERROR)//发送数据
    {
    serverSocket.Close();
    ::AfxMessageBox("数据发送失败!");
    return 0;
    }
    }

    Sleep(3000);

    }

    }

    return 0;
    }
    2016年8月27日 11:15

答案

  • Hi MV_C584,

    感谢在MSDN论坛发帖。

    一般情况下我们不直接调用close函数。析构函数在销毁archive, socket file, 和socket objects时,会调用Close 函数。

    关于更多socket使用技巧和示例,请参考以下文档。

    https://msdn.microsoft.com/en-us/library/09dd1ycd.aspx

    Best Regards,

    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    • 已建议为答案 Baron Bi 2016年9月7日 6:33
    • 已标记为答案 Baron Bi 2016年9月7日 6:34
    2016年8月29日 6:11

全部回复

  • 推荐使用winsock API去做,不要使用MFC类CSocket类,CSocket类默认会跟一个HWND窗口句柄绑定。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2016年8月28日 12:33
    版主
  • Hi MV_C584,

    感谢在MSDN论坛发帖。

    一般情况下我们不直接调用close函数。析构函数在销毁archive, socket file, 和socket objects时,会调用Close 函数。

    关于更多socket使用技巧和示例,请参考以下文档。

    https://msdn.microsoft.com/en-us/library/09dd1ycd.aspx

    Best Regards,

    Sera Yu


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.

    • 已建议为答案 Baron Bi 2016年9月7日 6:33
    • 已标记为答案 Baron Bi 2016年9月7日 6:34
    2016年8月29日 6:11