zoukankan      html  css  js  c++  java
  • C++ 网络编程


    定地?tcp、udp传输数据的时候。都需要一固定的地址:ip地址及其端口号。WinSock中,就用 SockAddr_in来指定。

    struct sockaddr_in

    {

    short sin_family

    u_short sin_port

    struct in_addr sin_addr

    char sin_zero[8]

    }

    //

    in_addr 可以把字符串编程点状的ip地址

    inet_addr 则相反

    声明如下:

    unsigned long inet_addr

    {

    const char* FAR* p

    }



    看了管道,知道了个大概,可是那么浅层次的了解。又无法解决问题。其实namedPip归根到底是提供一种简单的服务端/客户端模型来建立对某一路径的文件的操作(有byte模式和消息模式)

    基本API如下,msdn有一堆解释:

    首先创建一个指定名字的管道,调用如下API (具体参数查MSDN):
    HANDLE CreateNamedPipe

    创建一个新线程(CreateThread),轮循管道中是否有新消息到来,新线程中调用如下两个函数:
    BOOL ConnectNamedPipe
    BOOL DisconnectNamedPipe

    //新线程过程
    DWORD WINAPI InquiryPipeThreadProc(LPVOID lpParameter)
    {
    while(1)//堵死
    {
    if(TRUE!=ConnectNamedPipe(...))
    {
    //查询出错原因
    }
    ReadFile(...);
    DisconnectNamedPipe(...);
    PostMessage(...);//您可以将管道中收的内容发送给窗口过程的消息队列
    }
    return 1;
    }

    ---上面的东西远远不足,有哪些不足呢?
    首先,我们无法控制哪些人可以通过管道进行访问,哪些人需要被阻止,也就是DACL-----这也是管道的精髓。如果仅仅是普通的建立文件的读取关系的话,CreateFile不是就可以了吗?

    那么如何建立DACL呢?

    SECURITY_ATTRIBUTE 归根到底是初始化一个结构体去替代默认的情况

    附代码:未测试

    Code

    除了这点?还需要哪些改进?

    效率:如果我们用namePiped中,默认的情况是实时的,我们可以采用多线程来让它可以服务多个对象



    当然到现在还远远不够,最多我们仅仅了解什么是pip和构建的时候需要注意到的地方。但是对于它的实际用途还是不知道。那么pipe的实际用途是什么?

    一、并不是翻译MSDN
    二、管道是用来通信用的(消息队列知道不?)
    三、通信的过程当然需要读取和发送,读取的内容当然是你向管道写入的内容
    四、试问一下一个WEB程序想跟我们的应用程序进行通信你是如何做到的(讯雷,WEB中右键点击...)
    五、Window机制看来你还不了解,其实Window把所有设备都当做文件来进行操作,主要是为了建立统一接口。

     -(http://bbs.pediy.com/archive/index.php?t-63953.html)

    看看第四点:这个我也不大明白。web迅雷中不是一般都要定位到某一个驱动器吗,比如E:。可是管道的话。一般都是利用UNC来进行标识的;eg:  \\server\\Pipe\\

    六、有一些初学者估计对socket 和socket_in有些模糊,其实socket_in里面仅仅保存要连接的具体的端口、ip信息。

    而socket更多的是确定工作域、还有套用的协议。两个结合在一起绑定才是一个具体的通讯环境。

    七、listent的backlog代表的是能够缓存进处理队列的连接数,但是多少个客户端发起的请求却无法明白。

    八、accept(SOCKET,(SOCKETADDR)FAR*,int)  accept函数中的第二个参数是连接过来的客户端的信息,

    accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。(FROM:http://www.embeded.cn/online/linux_function/14.html)

    九、send(SOCKET,(char*)buf,int len,) 

  • 相关阅读:
    BZOJ 2594: [Wc2006]水管局长数据加强版
    BZOJ 2049: [Sdoi2008]Cave 洞穴勘测
    html5 canvas ( 贝塞尔曲线, 一片星空加绿地 ) quadraticCurveTo, bezierCurveTo
    c#.net 接收 base64 格式的数据并解析为图片
    html5 canvas ( 绘制一轮弯月, 星空中的弯月 )
    html5 canvas ( 圆和切点曲线的绘制 ) arc, arcTo
    html5 canvas ( 图片填充样式 ) fillStyle, createPattern
    html5 canvas ( 径向渐变, 升级版的星空 ) fillStyle, createRadialGradient
    html5 canvas ( 线性渐变, 升级版的星空 ) fillStyle, createLinearGradient, addColorStop
    html5 canvas ( 图形变换矩阵 ) transform, setTransform
  • 原文地址:https://www.cnblogs.com/xianqingzh/p/1562876.html
Copyright © 2011-2022 走看看