博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux网络编程之[Socket通信的常用函数简介]
阅读量:3745 次
发布时间:2019-05-22

本文共 2606 字,大约阅读时间需要 8 分钟。

Linux网络编程之[Socket通信]

  1. Socket通信的概念
  2. Socket相关函数

    Socket通信的概念

    Socket(套接字):

    它本身是一种通讯机制,它包含了一整套调用接口和数据结构的定义,它给应用进程提供了使用如tcp/ip等网络协议通讯的手段
    Linux中的网络编程通过socket接口实现,Socket既是一种特殊的IO,提供对应的文件描述符.一个完整的Socket都有一个(五元组)相关描述{协议,本地地址,本地端口,远程地址(ip地址),远程端口};每一个Socket有一个本地的唯一Socket,由操作系统来进行分配

Socket相关函数

#include
#include
int socket(int domain,int type,int protocol);Sokect创建在内核中,若创建成功返回内核文件描述符表中的socket描述符号参数: domain(常用) AF_INET ipv4因特网域 AF_INET6 ipv6因特网域 AF_UNIX unix域 AF_SPEC 未指定 protocol 通常为0,表示按给定的域和套接字类型选择默认的协议 type SOCK_STREAM 流式的套接字,提供可靠的面向连接的通讯流,使用TCP协议,保证数据传输的准确性和顺序性 SOCK_DGRAM 数据报套接字,无连接,数据通过相互独立的报文进行传输,无序,不保证可靠,使用数据报UDP协议 SOCK_RAW 原始套接字允许对低层协议如IP或ICMP直接访问,用于新的网络协议的实现与测试 SOCK_SEQPACKAGE 长度固定,有序,可靠的面向链接的报文传递

Socket通信中的字节序

1:不同体系结构的主机使用不同的字节序存储器中保存多字节证书,字节存储的顺序不同,有的系统是高位在前,低位在后,而有的是低字节在前,高字节在后.

2:字节序分为大端和小端字节序

3:网络协议使用网络字节序,即大端字节序

4:网络传输的数据大家是一定要统一顺序的,所有对于内部字节表示顺序和网络字节顺序不同的机器,就一定要对数据进行转换

(host to net long); uint32_t htonl(uint32_t hostlong);     将一个32为整数由主机字节序转换为网络字节序 (host to net short)  uint16_t htons(uint16_t hostshort);     将一个16位整数由主机字节序转换成网络字节序(net to host long) uint32_t ntohl(uint32_t netlong);     将一个32位整数由网络字节序转换成主机字节序 (net to host short) uint16_t ntohs(uint16_t netshort);     将一个16位整数由网络字节序转换成主机字节序号

通用的地址结构:

#include
struct sockaddr{ unsigned short sa_family; //internet地址族,AF_XXX char sa_data[14]; //14bytes的协议地址}sa_dat包含了一些远程电脑的地址,端口,套接字的数目,它里面的数据是杂容在一起的sa_family一般来说,IPV4使用AF_INET在传递给需要地址结构的函数的时候,把指向该结构的指针转换成(struct sockaddr*)传递进去

Internet地址结构

struct in_addr{    in_addr_t s_addr;//ipv4地址}struct sockaddr_in{    short int sim_family;//internet地址族(AF_INET)    unsigned short int sin_port;//端口号,16位    struct in_addr sin_addr; //internet地址,32位IPv4地址    unsigned char sin_zero[8]; //添0(为了格式对齐的填充位)}

这两个数据类型是等效的,可以相互之间进行转换,通常使用sockaddr_in更方便

IPV4的地址族和字符地址间进行转换

#include
const char *inet_ntop(int domain,const void* restrict addr,char* restrict str,socklen_t size); 返回:成功返回地址字符串指针,出错返回NULL 功能:网络字节序转换成点分十进制int inet_pton(int domain,const char* restrict str,void* restrict addr);返回:成功返回1,无效格式返回0,出错返回-1功能:点分十进制转换成网络字节序参数: domain:internet的地址族如AF_INET addr:Internet地址,如32位IPV4地址 str:地址字符串指针 size:地址字符串大下
struct sockaddr_in sin; char buf[16]; memset(&sin,0,sizeof(sin)); sin.sin_family=AF_INET; sin.sin_port=htons((short)3000); if(inet_pton(AF_INET,"192.168.2.1",&sin.sin_addr.s_addr)<=0){    //错误处理}printf("%s\n",inet_ntop(AF_INET,&sin.sin_addr.s_addr,buf,sizeof(buf)));

这些其实就是在创建socket的时候相对比较简单的一些调用,具体socket的使用是在传输层结合TCP和UDP来进行使用的

转载地址:http://vzbsn.baihongyu.com/

你可能感兴趣的文章
泛型擦除机制及相关问题
查看>>
Jackson日期反序列化时区问题
查看>>
《设计模式》
查看>>
单例设计模式
查看>>
面试题集锦(一)
查看>>
Calendar类方法——编写万年历的两种方式
查看>>
File类的使用——遍历所有文件及子文件以及遍历删除
查看>>
内存流的使用——基本使用
查看>>
RandomAccessFile 类的使用——基本使用
查看>>
Properties实现类——基本使用
查看>>
结构型模式——装饰者设计模式
查看>>
线程的同步——Synchronized和ReentrantLock
查看>>
网络编程基础
查看>>
python实现快速排序
查看>>
python实现归并排序
查看>>
二叉树的镜像实现(python版)
查看>>
ptqt5控件了解(三)
查看>>
自学C++(一)
查看>>
51单片机介绍(二)
查看>>
STM32F103 入门篇-5-初识STM32
查看>>