---恢复内容开始---

这部分从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

h_name – 地址的正式名称。
h_aliases – 空字节-地址的预备名称的指针
h_addrtype –地址类型; 通常是AF_INET
h_length – 地址的比特长度。
h_addr_list – 零字节-主机网络地址指针。网络字节顺序
h_addr - h_addr_list中的第一地址。

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;
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序),在linux下,端口号的范围0~65535,同时0~1024范围的端口号已经被系统使用或保留。
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体指针也可以指向
7.连接。参考https://blog.csdn.net/nyist327/article/details/45918769

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或文件发生了可读或可写事件。包括函数有:

FD_ZERO(&set); /*将set清零使集合中不含任何fd*/
FD_SET(fd, &set); /*将fd加入set集合*/
FD_CLR(fd, &set); /*将fd从set集合中清除*/
FD_ISSET(fd, &set); /*在调用select()函数后,用FD_ISSET来检测fd是否在set集合中,当检测到fd在set中则返回真,否则,返回假(0)*/
11.SOCKET_TIMEOUT  10,  10秒
  SOCKET_MILLSECONDS  500000, 0.5秒
12.select函数

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函数时:

(1)recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR;
(2)如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);
recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。

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函数解析(二)的更多相关文章

  1. Basestation函数解析(一)

    ---恢复内容开始--- 1._tmain   _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数. 首先,这个_tmain() ...

  2. PHP json_decode 函数解析 json 结果为 NULL 的解决方法

    在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...

  3. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...

  4. socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  5. async函数解析

    转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...

  6. tf.transpose函数解析

    tf.transpose函数解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me tf.transpose(a, perm = None, name = 'transpose') 解释 将a进 ...

  7. [转]socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  8. python重要的第三方库pandas模块常用函数解析之DataFrame

    pandas模块常用函数解析之DataFrame 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器 ...

  9. pandas模块常用函数解析之Series(详解)

    pandas模块常用函数解析之Series 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网 ...

随机推荐

  1. Sass进阶之路,之一(基础篇)

    Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...

  2. HDU 5253 连接的管道(Kruskal算法求解MST)

    题目: 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了.当老 J ...

  3. c#基础学习(0709)之vs通过抽象方法实现多态

    抽象类不能用来实例化对象 1.抽象类中可以有实例成员,也可以有抽象成员 2.抽象成员不能有任何实现 3.抽象类.抽象成员必须包含在抽象类中 4.抽象类不能用来实例化对象,既然抽象类不能被实例化,那么抽 ...

  4. 微信小程序: 编译.wxss文件错误解决

    博主最近又重新开始捡起微信小程序,想做点自己的东西.了解到最近小程序工具有做更新,就顺手更新了最新的版本,功能比之前强大了不少!  更新归更新,更新后控制台就一直报下面这个错误:  解决办法 有问题总 ...

  5. [javaSE] 变量的传值与传址

    变量:就是将不确定的数据进行存储.也就是需要在内存中开辟一个空间 这个空间需要一个名称,这个名称就是变量名 基本数据类型:byte,short,int,long,double,float,char,b ...

  6. SpringBoot(四) Core Features: Logging

    参考 文档: 26. Logging

  7. js中var与let

    问题 for (var iii = 0; iii < 3; iii++) { setTimeout(function(){ console.debug(iii) }, 1000) let let ...

  8. python数据类型之集合

    对python中集合的理解 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 s = set ...

  9. CSS 的介绍

    第一章 的介绍 1.CSS:“层叠样式表”,它是cascading style sheets的缩写,作用就是给HTML标签加表现形式(样式-显示),如:字体,图片,列表,位置等. 在浏览器中可以看到部 ...

  10. 记录在window平台安装python的第三库(py,whl)

    在下载python的第三库文件的时候,有些库文件有exe的发行版,但是有些第三库并没有找到针对于window的可执行文件安装包即exe文件,而只有源代码文件即py文件,和whl文件. 下面记录一下在w ...