Basestation函数解析(二)
---恢复内容开始---
这部分从Basestation的RecvDataThread开始,流程为
RecvDataThread->RecvData->Decoder->PostData。
RecvData->Decoder->PostData这三个一直循环。
首先了解序列化与反序列化:序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
1.Mysocket.cpp的BaseSock构造函数中,
m_sock = -1;可能需要改,使用时构造并不为-1.
#ifdef _WINDOWS WSADATA wsaData; WORD wVersionRequested = MAKEWORD( 2, 2 ); WSAStartup(wVersionRequested, &wsaData); #endif
makeword是将两个byte型合并成一个word型,一个在高8位(b),一个在低8位(a)
makelparam、makelong和makewparam都是一样的,将两个word型合并成一个dword型。一个在高16位,一个在低16位
delphi:word((byte(a)) or (word(byte(b))) shl 8);
比如a=2;b=1
2的二进制是00000010 1的二进制为00000001 B是表示高8位,A表示低8位 合并起来就是
100000010
MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能。
WSAStartup作用:为了在应用程序当中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
2.ioctlsocket ioctlsocket()是一个计算机函数,功能是控制套接口的模式。可用于任一状态的任一套接口。它用于获取与套接口相关的操作参数,而与具体协议或通讯子系统无关。
3.connect函数内部的:
hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
struct hostent h_name – 地址的正式名称。 h_aliases – 空字节-地址的预备名称的指针。 h_addrtype –地址类型; 通常是AF_INET。 h_length – 地址的比特长度。 h_addr_list – 零字节-主机网络地址指针。网络字节顺序。 h_addr - h_addr_list中的第一地址。
struct hostent
4.gethostbyname函数
gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构的指针。结构的声明与gethostbyaddr()中一致。
5.sockaddr_in
typedef struct sockaddr_in { #if(_WIN32_WINNT < 0x0600) short sin_family; #else //(_WIN32_WINNT < 0x0600) ADDRESS_FAMILY sin_family; #endif //(_WIN32_WINNT < 0x0600) USHORT sin_port; IN_ADDR sin_addr; CHAR sin_zero[]; } SOCKADDR_IN, *PSOCKADDR_IN;
connect(
__in SOCKET s,
__in_bcount(namelen) const struct sockaddr FAR * name,
__in int namelen
);
8.getsockopt getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。
9.toupper C语言toupper()函数作用是将小写字母转换为大写字母。
10.fd_set类和FD_ZERO函数
fd_set类实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是socket句柄,还是其他文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一socket或文件发生了可读或可写事件。包括函数有:
select函数决定一个或者多个套接字(socket)的状态,如果需要的话,等待执行异步I/O。
int select( __in int nfds, __inout fd_set *readfds, __inout fd_set *writefds, __inout fd_set *exceptfds, __int const struct timeval *timeout );
参数:
nfds:忽略。
readnfds: 指向检查可读性的套接字集合的可选的指针。
writefds: 指向检查可写性的套接字集合的可选的指针。
exceptfds: 指向检查错误的套接字集合的可选的指针。
timeout: select函数需要等待的最长时间,需要以TIMEVAL结构体格式提供此参数,对于阻塞操作,此参数为null。
select函数返回那些准备好并且包含在fd_set结构体的套接字的总数,如果超时,则返回0;如果错误发生,返回SOCKET_ERROR。如果返回值为SOCKET_ERROR,可以通过WSAGetLastError函数检索指定的错误码。
13.send函数相关解释,豁然开朗:
https://blog.csdn.net/yangkunqiankun/article/details/75943596
14.出错:R6010 -abort() has been called
堆栈溢出。
15.recv
函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags); 描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时:
16.IData
//纯虚数据接口 struct IData { IData(){} virtual ~IData(){} };
http://blog.51cto.com/vincent040/2052247
17. dynamic_cast
将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理
18.OutputDebugString 参照 https://www.cnblogs.com/mushan/p/3351321.html
#define MY_TRACE(...) { char buff[1024]; \ sprintf_s(buff,__VA_ARGS__); \ OutputDebugString(buff);}
19.freopen freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
20.CSerialDataForVRS类
包含DataForVRS和指向这个类对象的指针。
21.Auth函数
连接成功之后的进行授权发送服务。
22.basestation.exe在 2018-12-13
运行崩溃
Basestation函数解析(二)的更多相关文章
- Basestation函数解析(一)
---恢复内容开始--- 1._tmain _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数. 首先,这个_tmain() ...
- PHP json_decode 函数解析 json 结果为 NULL 的解决方法
在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...
- socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- async函数解析
转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...
- tf.transpose函数解析
tf.transpose函数解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.transpose(a, perm = None, name = 'transpose') 解释 将a进 ...
- [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题
Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...
- python重要的第三方库pandas模块常用函数解析之DataFrame
pandas模块常用函数解析之DataFrame 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器 ...
- pandas模块常用函数解析之Series(详解)
pandas模块常用函数解析之Series 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网 ...
随机推荐
- 基于python的多线程暴破脚本
搭建了一个本地wordpress,写一个基于多线程异步I/O的暴力破解 1 测试 提交错误的表单数据时,查看请求参数 登录时发送的cookie 2 登录分析 经过多次测试,发现无论是输入正确的密码还是 ...
- 让自己的程序支持livewriter
参考 http://www.cnblogs.com/Dah/archive/2007/04/02/697312.html 使用MetaWeblog. 在上面的博客里,基本说明了如何设置. 根据cn ...
- AE文档保存
private void barButtonItem4_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)//保存 { ...
- C# 进程间共享内存通信方式
从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 ...
- 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)
[名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化( ...
- 手把手教你写一个java的orm(五)
生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...
- mysql中的坑
1,MySQL建表中double类型不能限制数据长度! 2,……
- time模块,计算时间差
计算当前时间与所输入的时间的时间差 #1 计算当前时间的时间戳时间 t_now = time.time() # 计算以前的时间的时间戳时间 t_before = input('请输入时间(例如:200 ...
- ios 九宫格
#define kViewW 40 //宽度 #define kViewH 61 //高度 #define kColCount 4 //共几列 CGFloat marginX = (self.view ...
- Android 如何监听一个线程的开始和结束
方法一:轮训 比如主线程要等子线程在得到变量“val”值的时候开始用“val”的值来进行工作,使用轮训的方法如下: public class SubThread extends Thread{ pri ...