创建套接字
套接字描述符类似于文件描述符,UNIX、Linux把网络当文件看待,发送数据即写文件write,接收数 据即读文件read,销毁socket对象即关闭文件close,在UNIX、Linux系统下一切皆文件。
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
功能:在内核中创建一个套接字对象
domain:通信地址类型
AF_UNIX/AF_LOCAL/AF_FILE: 本地通信(进程间通信)
AF_INET: 基于IPv4(32位IP地址)的网络通信
AF_INET6: 基于IPv6(128位IP地址)的网络通信
type:通信协议类型
SOCK_STREAM: 数据流协议,即TCP协议
SOCK_DGRAM: 数据报协议,即UDP协议
protocol:特别通信协议,一般不用,置0即可
返回值:成功返回套接字描述符,失败返回-1
套接字的连接
当socket对象创建好以后,它并不能立即与其它socket对象无法找到它,需要把一个地址与它进行绑 定,这样它才能被其它socket对象连接并通信。
// 基本地址类型,它是socket系列接口的表面参数,而实际使用的是sockaddr_un或sockaddr_in
struct sockaddr
{
sa_family_t sa_family; // 地址类型,与创建socket对象时的domain参数一至即可
char sa_data[14]; // 它是只是占位而已
};
// 本地地址类型
#include <sys/un.h>
struct sockaddr_un
{
sa_family_t sun_family;
char sun_path[]; // 套接字文件路径
};
// 网络地址类型
#include <netinet/in.h>
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port; // 端口号,用于区分通信方的进程,1024~65535
struct in_addr sin_addr; // IP地址
};
struct in_addr
{
in_addr_t s_addr; // 32位IPv4地址
};
typedef uint32_t in_addr_t;
#include <sys/socket.h>
int bind (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:将套接字和通信地址绑定在一起
addr:sockaddr_un、sockaddr_in结构变量的地址
addrlen:地址结构变量的字节数,便于bind区分用户提供的是sockaddr_un或sockaddr_in
返回值:成功返回0,失败返回-1
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr* addr,socklen_t addrlen);
功能:socket对象A连接socket对象B
sockfd:socket对象A的描述符,也就是连接的发起者
addr:socket对象B的通信地址,socket对象B必须与该通信地址绑定过
addrlen:地址结构变量的字节数
返回值:成功返回0,失败返回-1