TCP/IP网络编程笔记Chapter I -3网络编程各基础函数的使用方法
在上一篇我们已经大概理解网络编程与套接字是做什么用的,本篇我们需要学会使用网络编程各基础函数的使用方法
1.套接字类型与协议设置-socket函数
#include<sys/socket.h>
int socket(int domin,int type,int protocol);
- 成功返回文件描述符,失败返回-1
- domain是套接字使用的协议族信息,我们将重点讲解PF_INET对应的IPv4协议族
- type 是传输的类型信息
①面向连接的套接字SOCK_STREAM特点:套接字必须一一对应;可靠的、按序传递的、基于字节的面向连接的套接字
②面向消息的套接字SOCK_DGRAM特点:不可靠的、不按序传递的、以高速传输为目的套接字
面向连接的套接字SOCK_STREAM | 面向消息的套接字SOCK_DGRAM |
---|---|
传输过程中数据不会消失 | 传输的数据可能丢失可能损毁 |
按序传输数据 | 强调快速传输而非传输顺序 |
传输的数据不存在边界 | 传输的数据存在边界 |
限制每次传输的数据大小 |
- protocol 是计算机通信使用的协议信息
大部分情况下传递0,除非同一协议族中存在多个数据传输方式相同的协议,才进行指定
eg
IPv4协议族中面向连接的套接字
int tcp_socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
IPv4协议族中面向消息的套接字
int udp_socket = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
2.地址族与数据序列-bind函数
(1)IP地址与端口号
①IP地址
IP是网络协议的简写,是为了收发网络数据而分配给计算机的值,IP地址分为两类IPv4和IPv6,IPv4是四字节地址族、而IPv6是16字节地址族。
②端口号
端口号是为了区分程序中创建的套接字而分配给套接字的序号,也就是说操作系统此端口号把数据传输给相应端口的套接字。
端口号由16位构成,可分配的范围0-65535(0 - 2^16 -1)但是0-1023分配给特定程序,所以应当分配此范围外的值。注:TCP套接字和UDP套接字不会共用端口号,允许重复。
(2)地址信息的表示
本节以IPv4为核心,讨论目标地址的表示方法,假如我们需要表示IPv4地址族,IP地址是211.204.214.76,端口号2048,我们需要用一个结构体作为地址传递给bind函数
struct sockaddr_in
{
sa_family_t sin_family;//地址族
unint16_t sin_port;//16位端口号unsigned short类型
struct in_addr sin_addr;//32位IP地址
char sin_zero[8];//不使用
}
其中内含的另一个结构体in_addr用来存放32位IP地址如下
struct in_addr
{
in_addr_t s_addr;//32位IPv4,unsigned long类型
}
下面说明sockaddr_in各个成员
- sin_family:每种协议族使用的地址族都不同,IPv4是4字节地址族、而IPv6是16字节地址族。
- sin_port:以网络字节序保存的16位端口号(网络字节序后面说明)
- sin_addr:以网络字节序保存的32位IP地址信息
- sin_zero[8]:填充0
此外,int bind(int sockfd,struct sockaddr,socklen_t addrlen);
由于bind函数需要struct sockaddr
的参数,如下
struct sockaddr
{