1、什么是socket 套接字
socke套接字是一个编程的接口 (网络编程的接口)、是一种特殊的文件描述符 (read/write),不局限于TCP/IP 。socket是独立于具体协议的网络编程接口这个接口是位于 应用层和传输层之间 。
类型:
(1)流式套接字 SOCK_STREAM
面向字节流,针对于传输层协议为TCP的应用
(2)数据报套接字 SOCK_DGRAM
面向数据报,针对于传输层协议为UDP的应用
(3)原始套接字 SOCK_RAW
程序之间对ip层进行访问,跳过了传输层
2、基于TCP套接字的编程流程
Server ----- 服务器
socket ----- 创建套接字
bind (服务器的ip和端口) ------ 绑定服务器ip与端口
listen ---- 监听
accept ----- 接受连接请求
read/write ------- 读写
close ------ 关闭
Client ------- 客户端
socket
设置服务器的ip和端口
connect ------ 发出连接请求
write/read
close
3、socket套接字的接口函数
1)创建一个套接字 socket
NAME
socket - create an endpoint for communication
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:创建一个套接字
参数:
domain:协议族
socket不局限于TCP/IP,它还可以指定其他的通信协议
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols
...
type:指定要创建的套接字类型
SOCK_STREAM 流式套接字 ---> TCP
SOCK_DGRAM 数据报套接字 ---> UDP
SOCK_RAW 原始套接字
...
protocol:协议,指定具体的应用层的协议
一般为 0 (不知名的私有协议)
返回值:
成功,返回一个套接字描述符 (>0)
失败,返回-1,同时errno被设置
例子:
// 创建一个TCP流式套接字
int sock_fd = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_fd == -1 )
{
perror("socket error ");
return -1;
}
printf("sock_fd = %d\n", sock_fd );
2) bind 绑定服务器的ip和端口
NAME
bind - bind a name to a socket
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:把一个地址绑定到套接字上
参数:
sockfd:指定要绑定的套接字描述符
addr:指向包含地址信息的 struct sockaddr 结构体的指针
addrlen:指定要绑定的地址结构体的长度,单位:字节
返回值:
成功,返回0
失败,返回-1,同时errno被设置
(2.1)网络地址结构体 (ip+端口)
socket接口可以用于 以太网(ipv4),也可以用于ipv6,....
不同的协议族,它们的地址是不一样的通用的地址结构体 所有的socket函数接口的 地址参数的类型都是 struct sockaddr {}
struct sockaddr
{
sa_family_t sa_family; //协议族
char sa_data[14]; //指定网络协议地址
}
==========================
Internet协议地址结构体 ( man 7 ip 进行查看)
struct sockaddr_in
{
sa_family_t sin_family; /* 协议族
in_port_t sin_port; /* 端口号 (网络字节序)