zoukankan      html  css  js  c++  java
  • Linux_C socket 一些知识

    1.大端字节序,即低地址高字节

    TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。例如上一节的UDP段格式,
    地址0-1是16位的源端口号,如果这个端口号是1000(0x3e8),则地址0是0x03,地址1是0xe8,
    也就是先发0x03,再发0xe8,这16位在发送主机的缓冲区中也应该是低地址存0x03,高地址
    存0xe8。但是,如果发送主机是小端字节序的,这16位被解释成0xe803,而不是1000。因此,发
    送主机把1000填到发送缓冲区之前需要做字节序的转换。同样地,接收主机如果是小端字节序的,
    接到16位的源端口号也要做字节序的转换。如果主机是大端字节序的,发送和接收都不需要做转
    换。同理,32位的IP地址也要考虑网络字节序和主机字节序的问题。

    处理方法: htonl/ htons / ntohl / ntohs   (h表示host,  n表示network)

     2.int accept(int s,struct sockaddr * addr,int * addrlen); 此函数中, 最后一个参数int * addrlen 为传入传出参数。由于cliaddr_len是传入传出参数,每次调用accept()之前应该重新赋初值。

    while (1) {
    cliaddr_len = sizeof(cliaddr);
    connfd = accept(listenfd,
    (struct sockaddr *)&cliaddr, &cliaddr_len);
    n = read(connfd, buf, MAXLINE);
    ...
    close(connfd);
    }

     3.客户端是不需要bind()的,因为没要必要使用固定端口,它的端口由内核自动分配。而需要connect()

    客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自
    己的地址,而connect的参数是对方的地址。

  • 相关阅读:
    关于微软 2012 暑期实习题第 5 题
    ZOJ 1608. Two Circles and a Rectangle
    在技术社区以外的博文中插入代码(把代码转换到 Html 文本)
    ZOJ 2240. Run Length Encoding
    C++中“引用”的底层实现
    采用路径模型实现遍历二叉树的方法
    ZOJ 简单题集合(四)
    ZOJ 3603. Draw Something Cheat
    关于类的虚函数表
    ZOJ 3499. Median
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4099266.html
Copyright © 2011-2022 走看看