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

这部分从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. Tornado长轮询和WebSocket

    Http协议是一种请求响应式协议, 不允许服务端主动向客户端发送信息. 短轮询是一种简单的实现服务端推送消息的解决方案, 客户端以一定间隔自动向服务端发送刷新请求, 服务端返回要推送的消息作为响应. ...

  2. Docker中“TERM environment variable not set.”问题

    在使用top查容器内部资源利用情况时候,发现无法使用,报“TERM environment variable not set.”错误.从网上找到了解决方案,经实验有效 root@103b5f05462 ...

  3. SQLServer数据库循环表操作每一条数据(游标的使用)

    DECLARE @FunctionCode VARCHAR(20)--声明游标变量DECLARE curfuntioncode CURSOR FOR SELECT FunctionalityCode ...

  4. SQL 修改表字段失败 解决方法

    OK  大功告成 !!!

  5. include,forward和param指令

  6. Guidlines and rules About Overwriting hashCode()

    Preface "The code is more what you’d call guidelines than actual rules" – truer words were ...

  7. SQLite的Integer类型

    SQLite 中的 INTEGER:带符号的整型,具体取决有存入数字的范围大小,根据大小可以使用1,2,3,4,6,8字节来存储. 在SQLite中,存储分类和数据类型也有一定的差别,如INTEGER ...

  8. UNIX 高手的另外 10 个习惯

    让我们面对现实吧:坏习惯很难改变.但是您已经熟悉的习惯可能更难克服.有时,重新审视某些事情可能让您遇到“啊哈,我没想到它能做到这一点!”的时刻.在 Michael Stutz 的优秀文章“UNIX 高 ...

  9. 修复IE7浮动元素自动换行的bug

    bug重现以及修复后的表现 2. HTML源码 <!doctype html> <html> <head> <meta charset="utf-8 ...

  10. JavaScript之Array

    JavaScript是一门非常灵活的动态语言,涵盖的内容也挺多,<JavaScript高级程序设计>看了也有两遍,但是在实际开发的时候,还是有很多东西记不清,然后还得去翻书,特别是一些Ar ...