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的参数是对方的地址。

  • 相关阅读:
    普通锁和分布式锁
    java 正则表达式
    java 字符串转date 格式转换
    消息中间件 kafka
    数据的存储方式:对象存储、文件存储、块存储
    Exceptional Control Flow(6)
    Exceptional Control Flow(5)
    Exceptional Control Flow(4)
    Exceptional Control Flow(3)
    Exceptional Control Flow(2)
  • 原文地址:https://www.cnblogs.com/wizzhangquan/p/4099266.html
Copyright © 2011-2022 走看看