MENU

C++ socket编程常用函数

前言

将最近经常使用到的常见socket编程函数做一个笔记记录。

socket

创建进程的套接字描述符。

int socket(int domain, int type, int protocol);

domain:协议族,常用的AF_INET(对应ipv4地址)、AF_INET6(对应ipv6地址)。
type:socket类型,常用的面向连接的流式Socket(SOCK_STREAM)即TCP连接,面向数据报的Socket(SOCK_DGRAM)即UDP连接。
protocol:指定协议,常用的协议IPPROTO_TCP(TCP传输)IPPROTO_UDP(UDP传输)。该protocol与type需要对应,即不能socket类型为UDP而协议为TCP。一般情况下该参数填为0自动使用socket类型的协议。

bind

绑定(ipv4/ipv6)地址并赋值给socket。

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

socketfd:进程套接字描述符。
addr:sockaddr结构体指针,包含IP地址以及端口。
addrlen:sockaddr结构体长度。

listen

监听新的连接请求。

int listen(int socketfd, int backlog)

socketfd:监听的套接字描述符。
backlog:最大连接数。

accept

接收客户端连接。客户端socket、connect后发送请求,此时服务端通过accept接受请求并建立链接。正常建立连接后返回新的通信套接字描述符(这里称为connect_fd需要与前面的socketfd区分)之前博主也栽倒这坑里

int accept(int socketfd, struct sockaddr *addr, socklen_t *addrlen)

socketfd:监听的套接字描述符。
addr:sockaddr结构体指针,与socket时候的区别是,这里保存的是客户端的IP地址以及端口
addrlen:addr结构体所占有的字节数。

write/read、send/recv

服务端与客户端进行I/O通信。

ssize_t write(int connect_fd, const void *buf, size_t len)
ssize_t read(int connect_fd, void *buf, size_t len)
ssize_t send(int connect_fd, const void *buf, size_t len, int flags)
ssize_t recv(int connect_fd, void *buf, size_t len, int flags)

connect_fd:已连接套接口的描述字。
buf:数据缓冲区。
len:缓冲区长度。
flags:参数如果为0则与write、read相同意义。或者有如下参数可选。

@see https://www.cnblogs.com/ben-ben/articles/2812494.html
MSG_DONTROUTE:不查找表。是send函数使用的标志,这个标志告诉IP,目的主机在本地网络上,没有必要查找表,这个标志一般用在网络诊断和路由程序里面。
MSG_OOB:接受或者发送带外数据
MSG_PEEK:查看数据,并不从系统缓冲区移走数据。是recv函数使用的标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容。这样在下次读取的时候,依然是一样的内容,一般在有过个进程读写数据的时候使用这个标志。
MSG_WAITALL:等待所有数据。是recv函数的使用标志,表示等到所有的信息到达时才返回,使用这个标志的时候,recv返回一直阻塞,直到指定的条件满足时,或者是发生了错误。

读取/写入成功返回字节数大小,失败的时候返回-1。可通过errno捕捉异常。

inet_addr

功能:将点分十进制IP地址转换为网络字节序

in_addr_t inet_addr(const char *cp);

示例

char ip[] = "127.0.0.1";
struct sockaddr_in addr;
# 转换为网络字节序
addr.sin_addr = inet_addr(ip);

inet_aton

功能:将点分十进制IP地址转换为网络字节序

int inet_aton(const char *string, struct in_addr *addr);

示例

char ip[] = "127.0.0.1";
struct sockaddr_in addr;
# 转换为网络字节序
inet_aton(ip, &addr.sin_addr);

inet_ntoa

功能:将网络字节序转换为点分十进制IP地址

char *inet_ntoa(struct in_addr);

示例

char ip[] = "127.0.0.1";
struct sockaddr_in addr;
# 转换为网络字节序
inet_aton(ip, &addr.sin_addr);
# 转换为点分十进制IP地址
char *strAddr = inet_ntoa(addr);

上手博主socket编程的一个简单例子

返回文章列表 文章二维码 打赏
本页链接的二维码
打赏二维码