1.socket是什么?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。(门面模式,用自己的话说,就是系统对外界提供单一的接口,外部不需要了解内部的实现。)
2.socket在哪里发挥作用?
3.Internet套接字的两种类型
流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;
数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
4.socket函数
两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。
应用程序调用socket函数来创建一个能够进行网络通信的套接字。
#include <sys/types.h>
#include <sys/socket.h>
函数原型 int socket(int domain, int type, int protocol);
第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);
第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。
该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。
6.本机转换
主机字节顺序与网络字节顺序之间的转换
htons()--"Host to Network Short"
htonl()--"Host to Network Long"
ntohs()--"Network to Host Short"
ntohl()--"Network to Host Long"
7.ipv4套接口地址结构
大多数套接口函数都需要一个指向套接口地址结构的指针作为参数。每个协议都定义他自己的套接口地址结构,以“sokcaddr_”开头,并以对应其协议族的唯一后缀结束。
以“sockaddr_in”命名,定义在<netinet/in.h>头文件中
struct in_addr
{
in_addr_t s_addr; //32bit IP address};
struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_fimily; //AF_INET
in_port_t sin_port; //16-bit TCP or UDP port number
//Network Byte Ordered};
struct in_addr sin_addr; //32_bit IPv4 address
//Network byte ordered
char sin_zero[8];
sa_family_t:套接口地址结构地址族
socklen_t:套接口地址结构长度,为uint32_t
in_addr_t:IPv4地址,一般为uint32_t
in_port_t:端口,一般为uint16_t
IPv4两种使用方法:serv.sin_addr表示的是struct in_addr结构;而serv.sin_addr.in_addr
表示的是一个uint32整数。当作为参数传递给任一个套接口函数时,套接口地址结构是通过指针传递的。但是通过指针来取得此参数的函数必须处理来自所支持的任何协议族的套接口地址结构。所以在<sys/socket.h>中定义一个通用地址接口:
struct sockaddr
{
uint8_t sa_len;};
sa_fanily_t sa_family;
char sa_data[14];