Linux--网络编程套接字

一:IP地址

1.基本概念:

  • IP地址是在IP协议中,用来标识网络中不同主机的地址
  • IP协议有两个版本,IPv4和IPv6,对于IPv4,IP地址是一个4字节,32位的整数(能表示2^32个主机);对于IPv6,IP地址是一个16字节,128位的整数。
  • 像192.168.0.1这种IP地址的表示方法,叫做点分十进制字符串风格。

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

二:端口号(port)

1.基本概念:

  • 端口号是一个2字节16位的整数,用来标识特定机器上的唯一一个进程
    :端口号只在网络上有用。
总结:IP地址和端口号统称为套接字,IP地址+端口号就可以标识网络上的唯一一个主机中的唯一一个进程。

三:TCP协议

1.直观认识TCP:

  • TCP是传输层的协议,它用来保证数据传输的可靠性和完整性。
  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流(放入内存的数据没有明显的格式要求)

2.UDP协议

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

四:网络字节序

  • 像内存中的多字节数据相对与内存地址有大端和小端之分一样,网络数据流同样也存在大端小端之分。网络中发送主机和接收主机都是按照内存地址从低到高的顺序发出(接收)但是由于发送主机和接收主机可能机型(大端机或小端机)不一样,就会造成数据不一致的问题,所以TCP/IP协议规定,网络数据流采用大端字节序。

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

     uint32_t htonl(uint32_t hostlong);
     uint16_t htons(uint16_t hostshort);
     uint32_t ntohl(uint32_t netlong);
     uint16_t ntohs(uint16_t netshort);

使用说明:

  • h表⽰host,n表⽰network,l表⽰32位⻓整数,s表⽰16位短整数,htonl就是长整数主机到网络。
  • 如果主机是⼩端字节序,这些函数将参数做相应的⼤⼩端转换然后返回;
  • 如果主机是⼤端字节序,这些 函数不做转换,将参数原封不动地返回

五:socket编程接口:

创建socket文件描述符

  • int socket(int domain, int type, int protocol);//第一个参数为地址类型,AF_INET(IPv4)或AF_INET6(IPv6);第二个参数表示socket的类型,UDP用SOCK_DGRA;最后一个参数设置为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表示非阻塞式,倒数第二个参数表示输入型参数(将发送消息的主机的信息写入)返回值表示实际上接收消息的大小

发送消息:

  • ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);//addr表示要给谁发,即接收者的相关信息

开始监听

  • int listen(int s, int backlog); 将sock设置为监听状态,第二个参数为等待队列的长度,通常设置为5-10

接收请求

  • 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);//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值