一、理解网络编程和套接字
1、概念理解
网络编程:编写程序使两台连网的计算机相互交换数据。
套接字(socket):网络数据传输用的软件设备
2、建立套接字
需要用到以下几个函数。
2.1 建立套接字 socket
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
参数解释:
domain:协议族
PF_INET IPV4协议
PF_INET6 IPV6协议
PF_LOCAL 本地通信的UNIX协议
PF_PACKET 底层套接字协议族
PF_IPX IPX Novell协议族
type:数据传输类型信息
SOCK_STREAM:面向连接的套接字
特点:
1、传输过程中数据不会消失
2、按序传输数据
3、传输数据不存在数据边界
SOCK_DGRM:面向消息的套接字
特点:
1、强调快速传输而非传输顺序
2、传输的数据可能丢失而可能损毁
3、传输的数据有数据边界
4、限制每次传输的数据大小
protocol:计算机键通信使用的协议信息
-->成功时返回文件描述符,失败返回-1
2.2 绑定 bind函数,分配地址信息
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *addr,socklen_t adddrlen);
int sockfd:套接字文件描述符
解析 struct sockaddr *addr:
struct sockaddr_in{
sa_family_t sin_famile; // 地址族
uint16_t sin_port; // 16位TCP/UDP 端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; // 不适用
};
sin_famile:
AF_INET IPv4网络协议中使用的地址族
AF_INET6 IPv6网络协议中使用的地址族
AF_LOCAL 本地通信中采用的UNIX协议的地址族
struct in_addr {
in_addr_t s_addr; // 32位IPv4地址
};
socklen_t adddrlen:第二个结构变量的长度
-->成功时返回0,失败时返回-1.
2.3 建立监听 listen
#include <sys/socket.h>
int liseten(int sockfd, int backlog);
-->成功时返回0,失败时返回-1.
2.4 请求连接 accept
#include <sys/socket.h>
int accept(int sockfd,struct sockaddr *,socklen_t *addrlen);
-->成功时返回文件描述符,失败时返回-1.
总结:
网络编程中接受连接请求的套接字过程,对于服务器端。
1、调用socket函数创建套接字
2、调用bind函数分配IP地址和端口
3、调用listen函数转为可接受请求状态
4、调用accept函数受理连接请求。
客服端:
1、调用socket函数和connect函数
2、与服务器端共同运行收发字符串的数据
客户端函数:
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
-->成功时返回0,失败时返回-1.
二、套接字类型与协议设置
解析函数:
int socket (int domain, int type, int protocol);
参解:
domain:套接字中使用的协议族 (Protocol Family)
PF_INET IPv4互联网协议族
PF_INET6 IPv6互联网协议族
PF_LOCAL 本地通信的UNIX协议族
PF_PACKET 底层套接字协议族
PF_IPX IPX Novell协议族
type:套接字数据传输的类型
类型1:面向连接的套接字 SOCK_STREAM
特点:
1、传输过程中数据不会消失
2、按序传输数据
3、传输的数据不存在数据便捷
类型2:面向消息的套接字 SOCK_DGRAM
特点:
不可靠、不按序传递的、以数据的高速传输为目的的套接字
protocol:计算机间通信中的协议
IPPROTO_TCP
IPPROTO_UDP
三、地址族和数据序列
网络地址分为 A B C D 等
A类地址的首字节范围:0~127
B类地址的首字节范围:128~191
C类地址的首字节范围:192~223
字节序转换:
在填充结构体的数据,要将sockadr_in结构体前数据转换成网络字节序。
unsigned short htons(unsigned short);
unsigned short ntons(unsigned short);
unsigned short htonl(unsigned long);
unsigned short ntonl(unsigned long);
注:
1、htons中的h代表主机host字节序
2、htons中的n代表网络network字节序
点分十进制:
将字符串形式IP地址转换成32位整数型数据
#include <arpa/inet.h>
in_addr_t inet_addr(cconst char *string);
成功:返回32位大端序值
失败:返回INADDR_NONE
int inet_aton(const char *string, struct in_addr *addr);
string:含有需要转换的IP地址信息的字符串地址值
addr:将保存转换结果的in_addr结构体变量的地址值
成功:1
失败:0
将网络字节序整数型IP地址转换成字符串
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr addr);
成功:返回字符的地址
失败:-1
持续更新中