签到

05月06日
尚未签到

共有回帖数 0

    此情若长久

    等级:
    预备知识
    1.什么是UDP
    百度百科上:

    UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序

    我的理解:
    UDP就像信件投递员,扔到你邮箱后什么都不管了,TCp就像快递投递,没你签收他走不了

    2.什么是端口
    百科:
    如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口 可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。   在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择。可见,把数据包顺利的传送到目的主机是没有问题的。问题出在哪里呢?我们知道大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。


    我的理解:
    很多信件到邮局,要不要区分,要,必须要,到福建的,到浙江的,到湖南的,不同的信件分到不同的端口,再由不同的运用程序取走
    编程开始
    代码采用WINAPI,觉得一定要用MFC的绕路,我最恨一辈子咬着MFC的尾巴不放的。不思进取

    1.初始化

    头文件部分

    #include Windows.h

    #pragma comment(lib,"ws2_32.lib")

    ws2_32.lib是Socket的库文件,上述代码相当于将ws2_32.lib加入了项目中,这个也可以在项目设置中达到同样的效果




    1.初始化版本号
    2.初始化Socket,别问我为什么要这么做,这个是必须要的
    3.确认版本是否符合要求


    我们看看各各变量的定义
    int m_Port;
    SOCKET m_Socket;
    //其实SOCKET就是int,不骗你

    1.创建socket,成功的话m_Socket就不是0了,标准惯例,照做
    2.就这么填,别的别管
    3.绑定套接字,照做(Socket)
    4.照做,别管

    假如你突然想问,什么是Socket,你可以把它理解成你的秘书,创建socket就相当于招聘秘书,然后给他一个编号,不同的秘书帮你处理不同的事,比如一个管财务,一个管日常


    以上的代码没有什么特殊的地方,你完全可以照着抄下来然后复制到你的项目中
    不过那些return是怎么回事,


    话说监听:
    而所谓的端口监听,是指主机网络进程接收到IP数据包后,察看其的目标端口是不是自己的端口号,如果是的话就接受该数据包进行处理。进行网络通讯的主机,既要发送数据,也要接受数据,所以就要开启相应的端口以接受数据。一个网络上的主机有可能开启多个网络进程(如即浏览网页又上QQ),也就是监听了多个端口。

    我的理解
    监听就是叫你的秘书一直等在你家某邮箱门口,一来信件就给你报告

    当然,你是高富帅,邮箱不仅仅一个1-2000号的邮箱被你用来做特定用途了,一般你不用他,2000以后的随你用

    如何让你的秘书去监听呢
    recvfrom函数(经socket接收数据):  
    函数原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
    ssize_t 相当于 int,
    socket_t 相当于int ,这里用这个名字为的是提高代码的自说明性。  
    参数:    s:标识一个已连接套接口的描述字。 
      buf:接收数据缓冲区。   
     len:缓冲区长度。   
     flags:调用操作方式。   
     from:(可选)指针,指向装有源地址的缓冲区。   
    fromlen:(可选)指针,指向from缓冲区长度值。  
    返回值:   如果正确接收返回接收到的字节数,失败返回0.
    其中s就是你的socket编号,就是之前的m_socket,缓冲区不懂什么意思的面壁去,面壁完再去翻XXX的教程文件部分,
    From是指
    SOCKADDR_IN m_From;,他记载了给你信件的人的信息,比如那家伙的IP
    fromlen就是sizeof SOCKADDR_IN,照填就是
    执行到recvfrom时会产生一个断点,就是程序停在这里不执行了,直到有数据进来才继续运行下去

    上代码




    关于发送数据,UDP有广播,多播,特定

    广播就像小学的广播体操,放给同一个学校的全部童鞋们听的(局域网同一网段),大家都听得到,多播是放给一群特定的人听的,还有一个叫“单播”么,我忘了,这个是放给某特定的人听的,看下面代码,第5部分就是看是否做好了发送的准备
    我们特别要注意地1-4部分

    1,SOCKADDR_IN这个是用来填写接收者地址的,非常重要,想想你邮寄快递没写地址会怎么样
    2,照填
    3,填写对方的地址,pDestIPaddr是一个char指针,指向对方地址如"192.168.1.100"
    假如我们把地址写成INADDR_BROADCAST,那么就相当于广播,放给在你同一网段的所有人听其实地址是(255.255.255.255)


    等等,直播还远没有结束,函数我们能都知道了,如何正确处理这些函数并达到我们想要的效果才是王道,我们应该对这些函数进行更好的封装并进行一些意外的处理

    那么,C++中我们还是使用熟悉的类封装,这里,搬出以前写的一个类供参考,并提供无脑使用方法
    新知识点:多线程




    Create():创建Socket,port是端口号
    SetBufferSize():设置缓冲区大小
    SetRecvSize():为期望接收的大小,这么干是出于安全考虑
    BeginListen():开始监听
    SendData():发送数据
    Free():使用完成后的释放工作
    GetErrorMessage ()取得错误信息
    虚函数GetRecvData():用于接收外来的数据,不懂虚函数的面壁去

    成员变量


    m_Port记录的是端口
    m_socket就是套接字了,秘书编号应该更好理解
    m_destIPAddr纯属漏网之鱼,多余的代码忘记删掉了

    还有一个静态函数这个是多线程的入口函数
    m_listing就是监听状态
    m_ThreadID为线程ID,下面那个是线程句柄,后面的不介绍了,都懂得

    楼主 2015-11-12 19:57 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知