原文链接:https://blog.csdn.net/weixin_38793855/article/details/104555343
C++socket网络编程(一):常用socketAPI函数
套接字分为三种类型
流式套接字(SOCK_STREAM)TCP使用的是此接口
数据报套接字(SOCK_DGRAM) UDP使用此接口
原始套接字(SOCK_RAW)用于开发新的协议
Socket常用的API
socket函数:创建嵌套字
SOCKET socket (int af , int type , int protocol)
af:指定应用程序使用的通信协议族,对于TCP/IP协议族,该参数设置为AF_INET
type:指定要创建的套接字类型,流套接字为SOCK_STREAM,数据报套接字为SOCK_DGRAM,原始套接字为SOCK_RAW
protocol:指定使用的协议,IPPROTO_TCP , IPPROTO_UDP , IPPROTO_RAW,IPPROTO_IP
return:该函数如果调用成功就返回新创建的套接字的描述符,失败返回IVALID_SOCKET,套接字藐视一个整数值
bind函数:服务器对socket进行地址和端口号的绑定
int bind(int sockfd,const struct sockaddr*addr , socklen_t addrlen)
sockfd:即socket描述字,socket()函数创建的唯一标识
addr:一个const struct sockaddr * 指针,指向要绑定给sockfd的协议地址
addrlen:对应的结构的长度
return:成功返回0 , 错误返回SOCKET_ERROR;
网络字节序相关的函数
htons() :将16位无符号整数从主机字节序转为网络字节序
htonl():将32为无符号整数从主机字节序转为网络字节序
ntohs():将16为无符号帧数从网络字节序转成主机字节序
ntohl():将32为无符号帧数从网络字节序转成主机字节序
inet_addr():若字符串有效,则将字符串转为32位二进制网络字节序的ipv4地址,否则为INADDR_NONE
inet_ntoa():将一个十进制网络字节序转为点十进制ip格式的字符串
listen函数:服务器监听socket套接字
int listen(int sockfd,int backlog);
sockfd:要监听的socket描述字
backlog:为未完成队列的大小,
return:该函数如果调用成功就返回0,否则返回SOCKET_ERROR,可以调用WASGetLastError()函数获取错误代码
accept函数:服务端接受客户端连接请求
int accept(int sockfd,struct sockadr*addr,socklen_t*addrlen);
sockfd:为要监听的socket描述字
addr:为指向struct sockaddr *的指针,用于返回客户端的协议地址
addrlen:为协议地址的长度
return:成功返回有内核自动生成的一个全新的socket,代表与返回客户端的TCP连接。失败,则返回IVALID_SOCKET
connect函数:客户端连接TCP服务器
int connect(int sockfd,struct sockaddr*serv_addr,int addrlen);
参数:
第一个参数即为客户端的socket描述字
第二个参数为服务器的socket地址
第三个参数为socket地址的长度
返回值:
成功返回0 , 错误返回SOCKET_ERROR
send函数:用send函数从TCP连接的另一端发送数据
int send(IN SOCKET s, IN const char FAR*buf , IN int len , IN int flags)
参数:
第一个参数即为客户端的描述字
第二个参数应用要发送的数据的缓存
第三个参数实际要发送的数据长度
第四个参数一般设置为0
返回值
成功返回>0 , 成功拷贝至发送缓冲区的字节数(可能小于len),错误返回SOCKET_ERROR
recv函数:用recv函数从TCP连接端的另一端接收数据
int recv(SOCKET s , char FAR *buf , int len , int flags);
参数:
第一个参数即为客户端的socket描述字
第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收的数据
第三个参数知名buf的长度
第四个参数一般设置为0
返回值:
成功返回时返回接收到的字节数,错误返回SOCKET_ERROR,连接关闭返回0
sendto函数:通用sendto函数从UDP连接的另一端发送数据
int sendto(int s,const void *buf , int len , unsigned int flags , const struct sockaddr *to , int tolen);
参数:
第一个参数即为客户端的socket描述字
第二个参数应用要发送数据的缓存
第三个参数为实际发送的数据长度
第四个参数一般设置为0
第五个参数要发送的地址
第六个参数要发送数据的长度
返回值:
成功返回值>0,成功拷贝至发送缓冲区的字节数(可能小于len),错误返回SOCKET_ERROR
recvfrom函数:都用recv函数从UDP连接的另一端接收数据
int recefrom(SOCKET s , char FAR *buf , int len , int flags,struct sockaddr FAR * from , int FAR * fromlen);
参数:
第一个参数为客户端socket的描述字
第二个参数指明一个缓冲区,该缓冲区用来存放rece函数接收到的数据
第三个参数指明buf的长度
第四个参数一般设置为0
第五个接收对方的地址
返回值
成功时返回接收到的字节数,错误返回SOCKET_ERROR
shutdown函数:禁止在指定的套接字上发送和接收数据,并不会关闭套接字,在调用closesocket()函数之前,所有与该套接字相关的资源都不会被释放
int shutdown(SOCKET s , int how);
参数:
第一个参数即为客户端的socket描述字
how的方式有三种:
SD_RECEIVE表明关闭接收通道,在接收socket上不再接收数据,如果当前接收缓冲中仍有未取出数据或者以后再有数据到达,则TCP会向发送端发送RST包,将连接重置。
SD_SEND表示关闭发送通道,TCP会将发送缓存中的数据都发送完毕,并在收到所有数据的ACK后向对端发送FIN包,表名本端没有更多数据发送,这个是一个优雅关闭过程。
SD_BOTH则表示同时关闭接收通道和发送通道。
返回值:
成功时返回0,错误返回SOCKET_ERROR
closesocket函数:关闭一个套接字
int closesocket(SOCKET s);
参数:
第一个参数即为要关闭的socket描述字
返回值:
成功时返回0 , 错误返回SOCKET_ERROR
setsockopt函数:设置套接字接口的选项
int setsockopt(SOCKET s , int level , int optname , const char *optval,int optlen);
参数:
第一个参数即为sockett描述字。
第二个选项定义的层次,目前仅支持SOL_SOCKET和IPPROTO_TCP层次
第三个需要设置的选项
第四个指向存放选项的缓冲区
第五个缓冲区长度
返回值:
成功时返回0 , 错误返回SOCKET_ERROR
getsockopt函数:获取套接字的选项的值
int getsockopt(SOCKET s , int level,int optname , char * optval,int *optlen);
参数:
第一个参数即为socket描述字
第二个参数选项定义的层次,支持SOL_SOCKET和IPPROTO_TCP层次
第三个需要获取的选项
第四个指向存放选项的缓存区
第五个缓冲区长度
返回值:
成功时返回0 , 错误返回SOCKET_ERROR