套接字编程之接口(2)

简介: 套接字:socket(插座、接口)的翻译,通常表示的是系统提供给程序员实现网络通信的一套接口,为啥封装这些接口呢?因为我们知道,网络通信中有很多的协议, 所以在这套接口中就提供了足够充足的选择。我们通常使用的主要是两个协议的通信程序编写:传输层的TCP和UDP协议。

具体操作接口介绍


创建套接字


  #include<sys/types.h>
  #incldue<sys/socket.h>
  int socket(int domain, int type, int protocol);

domain:地址域类型(具体用的是哪种方式,不同的方式有不同的地址结构:ipv4,ipv6,域间通信)

重点记住AF_INET,比较常用

image.png

  1. type:套接字类型
    注意:两种套接字不能混用,你创建的是哪种协议就要用哪个参数
  2. image.png
  3. protocol:协议类型
    注意:默认使用0,则表示使用套接字类型对应的默认协议,注意记住以下俩种:
    (1)IPPROTO_TCP: 值是6
    (2)IPPROTO_UDP:值是17
  4. image.png
  5. 成功返回一个套接字描述符,失败返回:-1;

为套接字绑定地址信息


  int bind(int socket, const struct sockaddr *address,socklen_t address_len);
1.sockfd:返回套接字的描述符
2.addr:要绑定的地址信息(不同地址域类型有不同的地址结构,故需要一个通用的地址结构)

通用地址结构:

 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、IPv6,以及后面要讲的UNIX Domain Socket. 然而, 各种网络协议的地址格式并不相同.

image.png

注意:

 1.IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址

 2.IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.

 3.socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;


sockaddr 结构


image.png


sockaddr_in 结构


image.png


image.png

虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP地址.


in_addr结构


image.png

in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数

typedef uint32_t in_addr_t
in_addr_t inet_addr(cosnst char*ip); 

功能:将点分十进制字符串ip地址转化为网络字节序的整数ip地址 ,如:将192.168.2.2->0x0202a8c0

const char *inet_ ntoa(struct in_ addr addr);
功能:将网络字节序整数P地址, 转换为一个点分 十进制字符串地址
struct in_ addr{
  in_ addr_ ts _addr;
}

image.png

发送数据


  ssize_ t sendto(int sockfd, void *buf, size_ _t dlen, int flag, struct sockaddr *peer,socklen_ t alen);

解释:


1.sockfd: socket返回的套接字描述符

2.buf:要发送的数据空间起始地址

3.dlen:要发送的数据长度,从buf地址开始, 发送dlen长度的数据

4.peer设置的是谁的地址,数据就发给谁,peer:对端地址信息,描述了数据要发送给谁

5.flag:默认0- 阻塞发送(发送缓冲区数据满了就等着)

6.alen:对端地址信息长度

7.**返回值:**成功返回实际发送数据字节长度;失败返回-1


接收数据

接收数据

  ssize_ .t recvfrom(int sockfd, void *buf, size. t dlen, int flag, struct sockaddr *peer, socklen _t *alel

解释:


1.sockfd:套接字描述符

2.buf:空间起始地址,接收到的数据就被放入到buf空间中

3.peer用于获取地址信息,peer中存的是谁,数据就是谁发送给我的,peer这个参数是在recvfrom函数中设置的,我们不用设置。peer:接收数据的同时,得直到数据是谁发的,因此这里的peer是个输出参数,用于返回对端地址信息

4.dlen:想要接收的数据长度

5.flag:默认0-阻塞接收(socket接收缓冲区中没有数据就阻塞,直到有数据)

6.alen:地址信息长度,也是一个输入输出参数,表示想要接收的地址信息长度,以及实际得到的地址信息长度

7.返回值:成功返回实际接收到的数据长度;失败返回-1


*注意:凡是涉及到获取地址信息的操作,地址信息都是socklen _t 类型的


关闭套接字


  int close(int fd)

字节序相关接口


主机字节序到网络字节序的转换: uint32_ t htonl(uint32 _ t val); uint16 t htons(uint16_ t val);

网络字节序到主机字节序的转换: uint32_ t ntoh(uint32 _ t val); uint16 _ t ntohs(uint16_ t val);

注意:

 这几个接口中已经进行了主机字节序的判断,因此不需要担心自己的主机字节序,32位数据转换接口,与16转换接口,不能混用

混用出错例子:

image.png

目录
相关文章
485通讯接口与232接口的区别
485通讯接口与232接口的区别
2682 1
|
网络协议 程序员 数据格式
套接字编程之接口(1)
套接字编程,通俗的来说:主要讲解的是如何编写一个网络通信程序 1.网络通信的数据汇总都会包含一个完整的为五元组(sip[源端ip地址]、sport[源端端口]、dip[目的端IP地址]dport、protocol[协议]);五元组完成的描述了数据从哪里来到哪里去,用的是什么数据格式。 2.网络通信,通常讨论的是俩个主机之间的通信:客户端&服务端  客户端网络通信程序:通常指的是用户使用的一端  服务端网络通信程序:通常指的是网络编写服务端程序的工作 3.同时我们需要了解:客户端永远都是首先发起服务请求的一端,因为服务器是不知道客户端的地址的,现在用的是动态地址分配,每次上网地址可能发生改变,
88 0
|
网络协议 安全
套接字编程:UDP通信程序编写、套接字接口、字节序转换接口
套接字编程:UDP通信程序编写、套接字接口、字节序转换接口
119 0
套接字编程:UDP通信程序编写、套接字接口、字节序转换接口
|
网络协议 Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——第8章 基本UDP套接字编程 8.1概述
在使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流。然而相比TCP,有些场合确实更适合使用UDP,我们将在22.4节探讨这个设计选择。
1458 0
|
网络协议 Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——1.3 协议无关性
我们只修改了程序的5行代码,得到的却是另一个与协议相关的程序:这回是与IPv6协议相关的。更好的做法是编写协议无关的程序。图11-11将给出本客户程序的协议无关版本,它使用了getaddrinfo函数(由tcp_connect函数调用)。
1555 0
|
网络协议 Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.10 UDP程序例子小结
一般来说,客户的IP地址和端口号都由内核自动选择,尽管我们提到过,客户也可以调用bind指定它们。在客户的这两个值由内核选择的情形下我们也提到过,客户的临时端口是在第一次调用sendto时一次性选定,不能改变;然而客户的IP地址却可以随客户发送的每个UDP数据报而变动(假设客户没有捆绑一个具体的IP地址到其套接字上)。
1522 0
|
JavaScript Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.14 UDP中的外出接口的确定
已连接UDP套接字还可用来确定用于某个特定目的地的外出接口。这是由connect函数应用到UDP套接字时的一个副作用造成的:内核选择本地IP地址(假设其进程未曾调用bind显式指派它)。这个本地IP地址通过为目的IP地址搜索路由表得到外出接口,然后选用该接口的主IP地址而选定。
1918 0
|
Unix API
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.5 UDP回射客户程序:main函数
本节书摘来自异步社区《UNIX网络编程 卷1:套接字联网API(第3版)》一书中的第8章,第8.5节,作者:【美】W. Richard Stevens , Bill Fenner , Andrew M. Rudoff著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1409 0