int socket(int domain, int type, int protocol);
domain:协议域,协议族(family),决定了socket的地址类型
????????AF_UNIX:本机通信
????????AF_INET:IPv4
????????AF_INET6:IPv6
type:socket类型
????????SOCK_STREAM:TCP流
????????SOCK_DGRAM:UDP数据报
????????SOCK_RAW:原始套接字
????????SOCK_PACKET
????????SOCK_SEQPACKET
protocol:协议,一般设置为0,domain参数未知情况下,可以起确定协议的种类的作用
????????IPPROTO_TCP:TCP传输协议
????????IPPTOTO_UDP:UDP传输协议
????????IPPROTO_SCTP:STCP传输协议
????????IPPROTO_TIPC:TIPC传输协议
创建一个socket描述符(socket descriptor),它唯一标识一个socket,后续把它作为参数,通过它来进行一些读写操作 ?
=================================服务端==================================
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:服务端socket描述字,它是通过socket()函数创建了,唯一标识一个socket
addr:一个const?struct?sockaddr *指针,指向要绑定给sockfd的协议地址
addrlen:地址长度
创建socket时,返回的socket描述字它存在于协议族空间中,没有具体地址。调用bind()函数将特定地址赋给socket,否则就当调用connect()、listen()时系统会自动随机分配
int listen(int sockfd, int backlog);
sockfd:服务端socket描述字
backlog:可以排队的最大连接个数
socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd:服务端socket描述字
addr:客户端的协议地址
addrlen:客户端的协议地址长度
accpet成功后,返回值是由内核自动生成的一个全新的描述字,代表与返回客户的TCP连接
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t:有符号整型
size_t:无符号整型
sockfd:读取数据的套接字描述符
buf:存储数据的缓存区地址指针。
len:缓存区的最大尺寸
flags:标志,一般都为0
?=================================客户端==================================
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:客户端的socket描述字
addr:服务器的socket地址
addrlen:地址的长度
客户端通过调用connect函数来建立与TCP服务器的连接
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
send 的参数含义如下:
sockfd:与远程程序连接的套接字描述符
buf:发送的信息的地址指针
len:信息长度。
flags:发送标记,一般都设为0
int close(int fd);
fd:描述字
测试代码
服务端
#include<stdio.h>
客户端
附件描述
#define UNIX_PATH_MAX 108
//Unix地址结构
struct sockaddr_un {
sa_family_t sun_family; /* 协议簇 */
char sun_path[UNIX_PATH_MAX]; /* 本地文件*/
};
//------------------------------------------------------------------------------
//ipv4地址结构
struct sockaddr_in {
sa_family_t sin_family; /* 协议簇 */
in_port_t sin_port; /* 端口 */
struct in_addr sin_addr; /* 地址 */
};
/* ip结构 */
struct in_addr {
uint32_t s_addr; /* ip */
};
//------------------------------------------------------------------------------
//ipv6地址结构:
struct sockaddr_in6 {
sa_family_t sin6_family; /* 协议簇 */
in_port_t sin6_port; /* 端口 */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* 地址 */
uint32_t sin6_scope_id; /* Scope ID (new in 2.4) */
};
/* ip结构 */
struct in6_addr {
unsigned char s6_addr[16]; /* ip */
};
|