学习笔记(01):C++网络编程进阶-sokcet常用API函数

立即学习:https://edu.csdn.net/course/play/6082/113743?utm_source=blogtoedu

C++网络编程

套接字分为三种类型

流式套接字(SOCK_STREAM)TCP使用的是此接口

数据报套接字(SOCK_DGRAM) UDP使用此接口

原始套接字(SOCK_RAW)用于开发新的协议

Socket常用的API

SOCKET socket (int af , int type , int protocol);

第一个参数指定应用程序使用的通信协议族,对于TCP/IP协议族,该参数设置为AF_INET

第二个参数指定要创建的套接字类型,流套接字为SOCK_STREAM,数据报套接字为SOCK_DGRAM,原始套接字为SOCK_RAW

第三个参数指 定使用的协议,IPPROTO_TCP , IPPROTO_UDP , IPPROTO_RAW,IPPROTO_IP

返回值:该函数如果调用成功就返回新创建的套接字的描述符,失败返回IVALID_SOCKET,套接字藐视一个整数值

bind函数:服务器对socket进行地址和端口号的绑定

int bind(int sockfd,const struct sockaddr*addr , socklen_t addrlen);

参数:

sockfd:即socket描述字,socket()函数创建的唯一标识

addr:一个const struct sockaddr * 指针,指向要绑定给sockfd的协议地址

addrlen:对应的结构的长度

返回值:

成功返回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);

参数:

第一个参数即为要监听的socket描述字

第二个参数为未完成队列的大小,

返回值:

该函数如果调用成功就返回0,否则返回SOCKET_ERROR,可以调用WASGetLastError()函数获取错误代码

accept函数:服务端接受客户端连接请求

int accept(int sockfd,struct sockadr*addr,socklen_t*addrlen);

参数:

第一个参数为要监听的socket描述字

第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址

第三个参数为协议地址的长度

返回值:

成功返回有内核自动生成的一个全新的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值