【Linux】网络编程套接字

IP地址

1.基本概念

  • IP地址是在IP协议中,用来标识网络中不同主机的地址
  • 对于IPV4来说,IP地址是一个4字节,32位的整数(能表示2^32个主机)
  • 对于IPV6来说,地址是一个16字节,128位的整数
  • 我们通常也使用"点分十进制"的字符串表示ip地址,例如192.168.0.1:用点分割的每一个数字表示一个字节,范围是0-255

注:IP地址可以标识网络上所有主机中的唯一一个主机

假设我们在电脑上使用qq给好友发送消息,因为qq运行起来就是个进程,这个过程仅仅使用IP地址找到目标主机还不行。还得有一个标识来区分给目标主机的哪个进程发消息

端口号

1.基本概念

端口号是传输层协议的内容:

  • 端口号是一个2字节,16位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • IP地址+端口号统称为套接字,能够标识网络上的某台主机上的某一个进程,
  • 一个端口号只能被一个进程占用

注:端口号只在网络上有用

TCP协议

TCP是传输层的协议,它用来保证传输层的可靠性和完整性

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

UDP协议

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报
  • 传输速度快

网络字节序

像内存中的多字节数据相对于内存地址有大小端之分一样,网络数据流同样也存在大端小端之分。

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存
  • 因此,网络数据流的地址应这样规定:先发出去的数据是低地址,后发出去的地址是高地址
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节

但是这样发送主机和接收主机就必须知道自己是大端还是小端,这里有一套接口(库函数)可以做网络字节序和主机字节序的转换

uint32_t htonl(uint_32 hostlong);
uint16_t htons(uint_16 hostshort);
uint32_t ntohl(uint_32 hostlong);
uint16_t ntohs(uint_16 hostshort);

使用说明

  • h表示host,n表示network,l表示32位长整数,s表示16位短整数。
  • 例如:htonl就是表示32位长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回
  • 如果主机是大端字节序这些函数不做转换,将参数原封不动的返回

Socket编程接口

创建 socket ⽂文件描述符 (TCP/UDP, 客户端 + 服务器)

  •  int socket(int domain, int type, int protocol);//第一个参数为地址类型,AF_INET;第二个参数表示socket的类型UDP用SOCK_DGRA,TCP用SOCK_STREAM;最后一个参数设置为0
  • int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);//第一个参数为socket文件描述符,第二个为设置网络相关信息的结构体;第三个参数为结构体的大小

接收消息:

  • ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);;flags置0表示非阻塞式,倒数第二个参数表示输入型参数(将发送消息的主机的信息写入)返回值表示实际上接收消息的大小

接收请求

  • int accept(int s, struct sockaddr *addr, socklen_t *addrlen);请求连接,反回真正用来通信的socket文件描述符,因为listen_sock一直处于监听状态,如果有客户端想要建立连接,就会由listen_sock将客户端信息传过来,等到连接成功或失败,它就继续去监听,第二个参数用来返回客户机的信息,最后一个参数为传入传出参数, 传入的是调用者提供,表示缓冲区addr的长度,为了避免缓冲区溢出问题,传出的是客户端地址结构体(struct sockaddr)的实际长度

建立连接

  • int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);客户端使用,用来与服务器建立连接,第二个参数为保存服务器相关信息的地址结构体,最后一个参数为结构体大小

将整数类型的ip转化为点分十进制风格的IP地址

  • const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//。第一个参数表示地址类型(IPv4或IPv6),第二参数为要转的IP地址,第三个参数表示转到哪(给缓冲区),最后一个表示缓冲区大小。

将点分十进制风格的IP地址转化为整数。

  • in_addr_t inet_addr(const char *cp);


 

猜你喜欢

转载自blog.csdn.net/lw__sunshine/article/details/80973387