vc socket 多线程 (记录一次自己调用window 底层API编写 vc socket 多线程的服务器网络程序)

本文分享了作者从使用MFC库的CAsyncSocket类转向使用Window API编写多线程VCsocket的经验。文章介绍了初始化阶段的注意事项,如WSAStartup()的调用,并探讨了不同类型的sockets及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我写的上一个网络程序是调用MFC库的CAsyncSocket(异步非阻塞)类完成的,根据网上的描述,这种类是基于Window的消息机制实现的,收到socket消息会调用OnXX(例如:Onreceive()),我也就没用多线程来处理。但是最终程序的测试结果显示,这种方式并发处理的效果并不好。所以接下来的这个项目,我准备调用window API编写 vc socket 多线程的网络程序。

这篇文章是根据我在设计这个项目的网络通讯框架,根据从头到尾与到的问题,通过自己的理解和网上找资料来解决

-------------------------  以下都是建立socket服务器的说明


1.vc socket的了解

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。

在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面的三个文件,否则会出现编译错误。
  1
>.WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。
  2
>.WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。 
  3
>.WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。

2.在初始化阶段调用WSAStartup()

以前是在用mfc编写socket程序时,在创建项目的时候会有是否使用socket套接字的选项,默认是不选中的,如果选中则项目生成时会在CXXApp::InitInstance()添加一段代码并在stdafx.h中包含头文件afxsock.h

if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}

这段代码的作用是初始化socket,该函数已封装了WSAStartup(),所以不用再调用WSAStartup()了。当然AfxSocketInit()属于mfc的底层API,跟Window的API是两个东西,这里讨论的socket全部用windowAPI。

注意:WSAStartup() 和 WSACleanup()最好成对使用,

至于这两个函数应该放在哪? 所有的socket API调用之前必须调用WSAStartup()。虽然我的程序的网络通讯模块没用mfc。但是我的程序的整体框架还是用的MFC框架。对socket的初始化,我放在CXXDlg::OnInitDialog()中

//初始化socket
WSADATA wsaData;
WORD version=MAKEWORD(1,1);
int e
rr=WSAStartup(version,&wsaData);
if(
err=0) 
{
MessageBox("Init  Error");
return FALSE;
}

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) 
{
WSACleanup();
return FALSE;
}

CXXDlg的析构函数中也有WSACleanup()来释放socket资源

知识点一: closesocket()和shutdown()的区别。close是关闭连接并释放资源。 而shutdown只是关闭发送或者接收或者两者,而并不是关闭连接。

2.建立Socket

因为我要考虑程序的并发处理能力所以,我要用多线程来处理等待连接和数据的接收和处理。


。。。这篇文章作为草稿放到了这里几天了,接下来是要写多线程的,一是发现简单的运用多线程挺简单的,只要会用creatthread这个API。二是涉及公司业务流程就不在这里帖代码了,有需要讨论的朋友私信我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值