CSocket用在多线程中

关于mfc下多线程socket出错 问?: 我用CSocket写通信程序,但执行到下面的函数时总出错,是什么原因?是多线程通信,每个线程创建了一个套接字:CMySocket *m_pClientSocket = New CMySocket;然后在OnSendSocket函数中调用:m_pClientSocket->Send(str,len);如果消息很少,或者中间有Sleep,则没有错误,否则必然出现ASSE 阅读详情
unsigned __stdcall CXXXChatRoomProcessor::ThreadFunc(void* lParam)
{
  if (!AfxSocketInit())
  {
    AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
    return FALSE;
  }
  ThreadParam *p = (ThreadParam*)lParam;
  CXXXChatRoomProcessor *processor = (CXXXChatRoomProcessor *)p->obj;
  processor->isRunThread = TRUE;
  if(processor->m_socket->m_hSocket!=NULL)
  {
    processor->m_bIsConnected = true;
    processor->OnCloseSocket();
  }
  processor->m_socket->SetProxy( processor->nProxyType, processor->ProxyHost, processor->ProxyPort,
    processor->ProxyUser, processor->ProxyPass, processor->bUseSocks5Logon );

  if(!processor->m_socket->create())
  {
    processor->OnConnect(-1);
    return false;
  }
  TRACE("正在连接聊天服务器/n");
  processor->m_socket->SetTimeOut(50000);
  if(!processor->m_socket->Connect(p->addr,p->port))
  {  
    processor->OnConnect(1);
    return false;
  }
  processor->m_socket->KillTimeOut();
  TRACE("连接聊天服务器完毕/n");
  processor->m_bIsConnected = true;
  processor->Active = true;
  processor->OnConnect(0);
  while(processor->isRunThread)
  {
    MSG msg;
    Sleep(5);
    if(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
    {
      ::TranslateMessage(&msg);
      ::DispatchMessage(&msg);
    }
  }
  
processor->OnCloseSocket();
  return true;
}

void CXXXChatRoomProcessor::Connect(char *svrAddr, unsigned short port)
{
  isRunThread = FALSE;
  pThreadParam.obj = this;
  pThreadParam.addr = svrAddr;
  pThreadParam.port = port;
  HANDLE  m_hThread = createThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &pThreadParam, 0, NULL);
}

void CXXXChatRoomProcessor::OnConnect(int nErrorCode)
{
  switch(nErrorCode)
  {
  case -1:
    OnChatMessage("/n初始化socket错误! 请重试...",RGB(0,100,0));
    break;
  case 1:
    {
      KillTimer(EVENT_LOGIN_TEST);
      KillTimer(EVENT_TRY_CONNECT);//停止
      int c =WSAGetLastError();
      m_socket->Close();
      if(!bAutoConnect) //如果是自动尝试重新连接,不弹出对话框
      {
        CString err;
        err.Format("/n连接聊天服务器失败,请重试! 错误代码:%d", c);//请检查网络连接是否正常!无法连接服务器,
        SetTrayIcon(XXXX_DISCONNECT);
        OnChatMessage(err,RGB(0,100,0));
      }
      bAutoConnect = false;
      m_bIsConnected = false;
      Active = false;
      SetTrayIcon(XXXX_DISCONNECT);
    }
    break;
  case 0: //如果连接成功
    {
      if(xxxx_conn==XXXX_GATESERVER)
      {
        if(m_bIsConnected)
        {
          std::string username = user;
          std::string password = pass;
          unsigned short clientversion =0x222;

          LoginChatRoomPacket* packet = XXXPacketFactory::newLoginChatRoomPacket();
          packet->setUserName(username);
          std::string md5Ret;
          getStringMD5Value(password.c_str(),md5Ret);
          packet->setPassword(md5Ret);//password
          packet->setClientVersion(clientversion);
          char* buf = new char[packet->getPacketLength()];
          XXXPacketFactory::toCharBuffer(packet,buf);

          m_socket->Send(buf, packet->getPacketLength());

          XXXPacketFactory::freePacket(packet);
          delete[] buf;

          //同时启动登录返回测试消息时间中断验证过程,如果10秒钟内没有消息返回,认为服务器那头有问题。同时提示登录超时
          TRACE("正在登录服务器/n");
          OnChatMessage("正在登录服务器...",RGB(0,100,0));
          SetTimer(EVENT_LOGIN_TEST,30000,NULL);
        }
      }
      else if (xxxx_conn==XXXX_SERVER)
      {
        //登录消息服务器
        LoginInServer();
      }
    }
    break;
  }
}
 
C++实现的socket服务端源码 vs2010实现的socket服务端代码,C++编程,适合入门者下载看看 立即下载

相关推荐

基于MFC 的Socket类的多线程文件传输

基于MFC 的CSocket类实现的一个多线程的局域网文件传输,例子比较详细,希望能帮到你。

MFC下CSocket编程详解(CSocket 多线程)

MFC下CSocket编程详解(CSocket 多线程) 发表于 2014年04月11日  发表评论 • 分享到... MFC下CSocket编程详解: 1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN): CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的 CSocket::Socket 初始化)CSocket::Socket初始化CS

又被扼杀在萌芽 4600

CSocket-com.rar_csocket 多线程

socket多线程技术,实现计算机通信

c语言 socket单播创建,CSocket之多线程Demo(单播+多播)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MCAST_PORT 8080#define SERV_PORT 8080#define PORT 8080#define MCAS...

weixin_28895791的博客 425

[uboot] (第四章)uboot流程——uboot编译流程

uboot编译流程简单介绍

ooonebook的博客 1万+

「极简」扣子(coze)教程 | 细节决定成败!这个小功能让用户满意度飙升,讲的太细了

这一期大师兄通过向扣子(coze)应用添加提示语的方法向用户显示系统运行的状态。

u014527622的博客 2113

多线程 socket

MFC下使用CSocket或者CAsyncSocket进行Socket通信,CSocket继承自 CAsyncSocket。这两者的区别在于,CSocket是同步的Socket,CAsyncSocket则是异步的。使用时,CSocket::Receive()和CSocket::Send()函数会阻塞当前线程,直至操作完成;而 CAsyncSocket::Receive()和CAsyncSocket

pedoming的专栏 5407

保姆级教程:在Ubuntu 22.04上用Conda搞定nuPlan数据集环境(Python 3.9 + PyTorch)

本文提供了一份详细的Ubuntu 22.04环境下使用Conda配置nuPlan自动驾驶数据集的保姆级教程,涵盖Python 3.9安装、Conda环境管理、PyTorch配置及数据集可视化验证等关键步骤,帮助开发者高效搭建开发环境。

weixin_29061997的博客 255

vc c语言多线程,多线程 + CSocket 遇到的困惑

多线程 + CSocket 遇到的困惑大侠们,偶遇到困难了,请拔刀啊!!!! 有点长,恳请看完,不吝赐教啊!!!本人用MFC 写的一个客户端程序,分别连接两个服务端程序。共三台计算机协作,客户端计算机为Client,两个服务端计算机为 CMDServer和DATAServer。Client连接DATAServer 上的两个端口,这两个端口分别接受命令和发送数据。Client接到CMDServe...

weixin_39619858的博客 325

86 arduino 电机yl_(八)arduino入门:直流电机控制

一、本节介绍在本实验中,您将学习如何使用驱动芯片L293D和SunFounder Uno板控制小型直流(DC)电机的方向和速度。为了使初学者更容易,我们将让直流电机左右旋转,自动加速和减速。二、材料准备1 *小型直流电机1 * L293D1 * Arduino Uno板1 *面包板1 * USB数据线杜邦线三、原理讲解L293D这是一个非常实用的芯片,可以独立控制两台直流电机。在这个实验中,只有一...

weixin_29163857的博客 3568

VSCode多文件C语言项目编译实战:从配置到运行

本文详细讲解了如何在VSCode中配置多文件C语言项目的编译环境。通过手把手教学,指导读者创建项目结构、编写代码,并重点深度配置task.json与launch.json文件,实现一键编译和调试所有C文件,解决常见的“undefined reference”等链接错误,提升开发效率。

g8f9d0s1a2的博客 1098

CAsyncSocket ,CSocket多线程环境

CAsyncSocket ,CSocket多线程环境我接触Windows网络编程有一段时间了,对Windows网络编程,Windows网络编程模型和Linux网络编程模型有一个很不一样的地方,这就是异步选择模型。异步选择模型和普通的选择模型有着本质的区别,这个模型利用了Windows的窗口消息机制 。在Linux网络编程里,最常用的是select模型,调用select函数后,...

weixin_34365635的博客 303

用 n8n 提取静态网页内容:从 HTTP Request 到 HTML 节点全解析

本文介绍了如何使用n8n的HTTP Request和HTML节点组合提取静态网页内容。首先通过HTTP Request节点获取网页HTML源码,然后使用HTML节点解析并提取所需数据。关键点包括:1)HTTP Request节点设置URL和GET方法;2)HTML节点配置Source Data为JSON并指定data字段;3)重点掌握Extraction Values参数,特别是CSS选择器(使用.和#定位元素)、Key命名、Return Value类型选择等。文章通过实例演示了标题和正文的提取方法,并提供

muyouking 4567

csocket的多线程接收数据

csocket是MFC 的一个较高级的一个封装类。虽然封装了很高层,但是封装地不科学,灵活使用它是一个技术活。csocket自带的一些消息响应,比如onRecieve,onConnect等待,都是使用一些循环读取来封装,这样,当我们写多线程读取的时候就会出现很多问题。比如在onRecive中启动新的线程来接收这些数据,但是如果单单把csocket指针传送给子线程的时候,如果接收的数据多的话,那么就

eureka 1977

CREO图文教程:三维设计案例之矿泉水瓶实例图文教程之详细攻略

草绘,先绘制中心线,绘制底部宽度;对称标注:点击左端点,中心线,左端点,中键即可标注;给定高度;样条曲线绘制外形(双击样条曲线,点击下栏的控制模式(第一个按钮),再拉动控制样条曲线上的各个点)打勾即可得到三维实体。......

走向CTO之路 1934

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 868

CSocket在多线程环境下使用Static库出错的解决办法

 CSocket在多线程环境下使用Static库出错的解决办法   这几天都在做密码课程实践,其中需要做一个双机密码演示,需要用DH密钥交换协议交换密钥,然后再用一种对称密钥对双机通讯信息进行加解密。我用MFC来做的,主程序采用CAsyncSocket异步通讯的方式。选择CAsyncSocket是因为它是异步的,可以采用实践触发模式。在进行文件传输的时候,我采用了多线程加C

charles_y的专栏 1368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

CSocket,CAsyncSocket多线程退出时的一些注意事项(解决关闭WinSoket崩溃的问题)

CSocket,CAsyncSocket多线程退出时的一些注意事项(解决关闭WinSoket崩溃的问题)

Littleree的博客 206

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

CSocket详解

CSocket的用法 CSocket在CAsyncSocket的基础上,修改了Send、Recieve等成员函数, 帮你内置了一个用以轮询收发缓冲区的循环,变成了同步短连接模式。 短连接应用简单明了,CSocket经常不用派生就可以直接使用,但也 有些问题: 1、用作监听的时候 曾经看到有人自己创建线程,在线程中创建CSocket对象进行Listen、 Accept,若Accept成功

Barry的博客 9975

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

一个管理监听、连接、发送、接收、组包的CSocket派生类

简介:     CAdmitSocket,从CSocket派生,它比CSocket增加的内容就是管理Accept后的Socket连接,重新定义Send函数。管理接收数据并组包,并在收到整包数据后,调用OnRecResponse(  LPBYTE, int )虚函数。 使用要点:     你所使用的Socket必须从CAdmitSocket派生,并重载OnRecResponse()、OnSocket

jmcooler的专栏 4098

CAsyncSocket及CSocket

MFC疑难注解:CAsyncSocket及CSocket2009-12-21 20:23MFC疑难注解:CAsyncSocket及CSocketMFC对SOCKET编程的支持其实是很充分的,然而其文档是语焉不详的。以至于大多数用VC编写的功能稍复杂的网络程序,还是使用API的。故CAsyncSocket及CSocket事实上成为疑难,群众多敬而远之。余好事者也,不忍

fengxo的专栏 2756
上一篇: 如何防止拖动窗体大小时控件闪烁的问题
下一篇: base64编码和解码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值