socket
函数简介
socket()创建一个用于通信的端点,并返回一个引用该端点的文件描述符。这个
成功调用返回的文件描述符将是当前未打开的最低编号的文件描述符(int 型)
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int socket(int domain, int type, int protocol);
domain(域)
域参数指定通信域;选择用于通信的协议系列通信。这些族在<sys/socket.h>中定义。当前理解的格式包括:
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
AF_IPX IPX - Novell protocols
AF_NETLINK Kernel user interface device netlink(7)
AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)
AF_AX25 Amateur radio AX.25 protocol
AF_ATMPVC Access to raw ATM PVCs
AF_APPLETALK AppleTalk ddp(7)
AF_PACKET Low level packet interface packet(7)
AF_ALG Interface to kernel crypto API
type(通信语义类型)
套接字具有指定的类型,该类型指定通信语义。当前定义的类型常用的有:
SOCK_STREAM 提供有序、可靠、双向、基于连接的字节流。带外数据传输可以支持任务机制。
SOCK_DGRAM 支持数据报(固定最大长度的无连接、不可靠消息。
protocol(协议指定)
协议指定与套接字一起使用的特定协议。通常只有一个协议存在
在给定的协议族中支持特定的套接字类型,在这种情况下protocol可以指定为0。
例程:
int socketId=socket(AF_INET,SOCK_STREAM,0);
if(socketId==-1){printf("creat socket id error\n");return -1;}
sockaddr_in
头文件
#include<netinet/in.h>
#include <arpa/inet.h>

hton-()
函数简介
在主机和网络字节顺序之间转换值
htonl()将无符号整数hostlong从主机字节顺序转换为网络字节顺序
htons()函数的作用是:将无符号短整数hostshort从主机字节顺序转换为网络字节顺序
ntohl()函数的作用是:将无符号整数netlong从网络字节顺序转换为主机字节顺序。
ntohs()函数的作用是:将无符号短整数netshort从网络字节顺序转换为主机字节顺序。
bind()
函数简介
将socketID 与sockaddr_in结构体绑定
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
lsiten
函数简介
监听socketID的连接
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int listen(int sockfd, int backlog);
backlog参数定义了sockfd的挂起连接队列可以增长到的最大长度。如果当队列已满时,
连接请求到达时,客户端可能会收到一个指示ECONNRE‐的错误熔融,或者,如果基础协
议支持重传 ,请求可能被忽略,以便稍后重试连接成功。
如果成功,则返回0。出现错误时,返回-1
accept
#include<sys/socket.h>
int accept(int sockfd, struct spckaddr *addr, skcklen_t *sddlen);
参数:
第一个参数: int sockfd:
--->服务器套接字的文件描述符
第二个参数: struct spckaddr *addr
--->保存发起连接请求的客户端地址信息的变量地址值,也就是返回链接
客户端地址信息,含IP地址和端口号需要强制转换类型,之前讲过
第三个参数: skcklen_t *sddlen
--->传入sizeof(addr)第二个参数的大小,函数返回时返回真正接收到
地址结构体的大小
值得一提的是第二个参数和第三个参数:
第二个参数:传出参数,返回的连接成功的信息,所以我们不需要对这个套接字进行初始化。
第三个参数:传入传出参数,一开始传入一个参数防止溢出,调用完成之后长度会发生改变。
因为是类型不是int 所以我们一般会在前面定义一个 skcklen_t 变量来衡量大小。
第三个参数具体使用:
skcklen_t = cliaddr_len;
cliaddr_len = sizeof(cliaddr);
connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
传出所以需要涉及修改值,所以传入地址。
返回值:
成功:成功返回一个新的socket文件描述符,用于和客户端通信。
失败:返回-1,设置errno