zoukankan      html  css  js  c++  java
  • Linux下socket编程基本知识

    本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数。

    本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观。

    Linux网络编程 Linux网络编程|人工智能物联网

    1.概念

    1.1套接字(socket)

    Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段。

    Linux中的网络编程通过socket接口实现,socket既是一种特殊的IO,提供对应的文件描述符。一个完整的socket都有一个相关描述,简称五元组(协议、本地地址、本地端口、远程地址、远程端口),每一个socket有一个本地的唯一的socket,由操作系统分配。

    1.2字节序

    字节序分为大端字节序和小端字节序,网络协议使用网络字节序即大端字节序。

    内部字节表示顺序和网络字节顺序不一样的机器,要对数据进行转换。

    2  字节序转换常用函数

    uint32_t htonl(uint32_t hostlong);

    将一个32位整数由主机字节序转换为网络字节序

    uint16_t htons(uint16_t hostshort);

    将一个16位整数由主机字节序转换成网络字节序

    uint32_t ntohl(uint32_t netlong);

    将一个32位整数由网络字节序转成主机字节序

    uint16_t ntohs(uint16_t netshort);

    将一个16位整数由网络字节序转换成主机字节序

    3 数据结构

    3.1 通用地址结构(一般不使用,但是内核中是使用的,所以需要强制转换为此种数据结构)

    1 #include <sys/socket.h>
    2 struct sockaddr{
    3     unsigned short sa_family;
    4     char sa_data[14];
    5 };

    sa_data:包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂糅在一起的。

    sa_family:一般来说IPv4使用AF_INET。

    在传递给需要地址结构的函数时,把指向该结构的指针转换成struct sockaddr *传递进去。

    3.2因特网地址结构

     1 struct in_addr{
     2     in_addr_t s_addr //IPv4地址
     3 };
     4 
     5 struct scokaddr_in{
     6     short int sin_family; //Internet地址族如AF_INET(主机字节序)
     7     unsigned short int sin_port; //端口号,16bit(网络字节序)
     8     struct in_addr sin_addr; //Internet地址,32bit IPv4地址(网络字节序)
     9     unsigned char sin_zero[8]; //添0(为了格式对其的填充位)
    10 };

    通用地址结构和因特网地址结构数据类型是等效的,可以相互转换,通常使用sockaddr_in更为方便。

    4.基本函数

    4.1创建socket

    1 #include <sys/socket.h>
    2 int socket(int domain, int type, int protocal)

    返回:成功返回文件描述符,出错返回-1。

    socket创建在内核中,若创建成功返回内核文件描述表中的socket描述符。

    参数:

    domain:AF_INET IPv4因特网域、AF_INET6 IPv6因特网域、AF_UNIX unix域、AF_UNSPEC 未指定。

    protocol:通常为0,表示按给定的域和套接字类型选择默认协议

    type:SOCK_STREAM 流式套接字,可以提供可靠的、面向连接的的通讯流,它使用TCP协议,TCP保证了数据传输的正确性和顺序性。

    SOCK_DGRAM 数据报套接字,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错,使用数据报协议UDP协议。SOCK_RAW 原始套接字,允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议实现的测试等。SOCK_SEQPACKET 长度固定的、有序、可靠的面向连接报文传递。

    4.2.IPv4地址族和字符地址间的转换函数

    1 #include <arp/inet.h>

    功能:将网络字节序转换位点分十进制

    1 const char* inet_ntop(int domain, const void *restrict_addr, char *restrict_str, socklen_t size);

    功能:将点分十进制转换为网络字节序

    1 const char* inet_pton(int domain, const void *restrict str, char *restrict addr);

    参数:

    domain:Internet地址族,如AF_INET

    addr:Internet地址,32位IPv4地址(网络字节序)

    str:地址字符串(点分十进制)指针

    size:地址字符串大小

    4.3填写IPv4地址族结构案例

     1 struct sockaddr_in sin; //定义一个sockaddr_in结构体
     2 char buf[16];
     3 memset(&sin, 0, sizeof(sin));
     4 sin.sin_family = AF_INET; //填写Internet地址族
     5 sin.sin_port = htons((short)3001); //填写端口号(网络字节序)
     6 //填写sin_addr
     7 if (inet_pton(AF_INET, "192.168.2.1", &sin.sin_addr.s_addr) <=0)
     8 {
     9     //错误处理
    10 }
    11 printf("%s
    ", inet_ntop(AF_INET, &sin.sin_addr.s_addr, buf, sizeof(buf)));
  • 相关阅读:
    android学习-仿Wifi模块实现
    爬虫4:cookie登陆并爬取学习成绩
    爬虫3:表单登陆
    爬虫2:爬取百度贴吧的帖子
    爬虫1:爬虫爬取糗事百科
    js中的typeof 操作符
    基于 Token 的身份验证方法
    Jfinal 列表分页
    百度地图逆地址解析
    Jfinal 项目搭建
  • 原文地址:https://www.cnblogs.com/mrlayfolk/p/11968424.html
Copyright © 2011-2022 走看看