网络编程基本函数

网络编程

网络编程

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。网络编程

一、struct addrinfo结构体

struct addrinfo {
    int ai_flags;             /* AI_PASSIVE, AI_CANONNAME */
    int ai_family;            /* AF_xxx */
    int ai_socktype;          /* SOCK_xxx */
    int ai_protocol;          /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
    socklen_t ai_addrlen;     /* length of ai_addr */
    char *ai_canonname;       /* ptr to canonical name for host */
    struct sockaddr *ai_addr; /* ptr to socket address structure */
    struct addrinfo *ai_next; /* ptr to next structure in linked list */
}; 

参数

    ai_flags:标志(见下)
    ai_family:协议族。同socket()函数参数1一致
    ai_socktype:socket类型。同socket()函数参数2一致
    ai_protocol:协议类型。同socket()函数参数3一致
    ai_addrlen:ai_addr地址的长度
    ai_canonname:该主机对应的标准名称
    ai_addr:该结构体对应的一个网络地址
    ai_next:指向下一个addrinfo结构体的指针

二、getaddrinfo()

int getaddrinfo (const char *__restrict __name,
const char *__restrict __service,
const struct addrinfo *__restrict __req,
struct addrinfo **__restrict __pai);
解析网址,返回IP地址,addrinfo的结构(列表)指针
参数一:主机名,由字符串构成,可以是ip地址点分十进制表达方式的字符串
参数二:null或 字符形式端口号
参数三:指向addrinfo对象的指针
参数四:PADDRINFOA为addrinfo指针类型,定义成PADDRINFO ai,传入&ai。

三、socket()

// int socket(int domain, int type, int protocol);
// 如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。
// 建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。

四、freeaddrinfo()

void freeaddrinfo (struct addrinfo *__ai) __THROW;
//功能:由getaddrinfo返回的所有存储空间都是动态获取的(譬如来自malloc调用),包括addrinfo结构、ai_addr结构和ai_canonname字符串。这些存储空间通过调用freeaddrinfo
//返还给系统ai参数:应指向由getaddrinfo返回的第一个addrinfo结构。这个链表中的所有结构以及由它们指向的任何动态存储空间(譬如套接字地址结构和规范主机名)都被释放掉

五、bind()

// Bind to interface address 绑定到接口地址
//bind执行成功时返回0,失败返回-1.
// int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) __THROW;
// 参数一:调用socket函数返回的文件描述符
// 参数二:要绑定的给此描述符的协议地址,此处定义了一个宏,原型是const struct sockaddr *,sockaddr 是一个通用结构体,可以包含多种类型的协议地址,但是也带来了使用不便的影响,后又针对具体的协议,制定了不同的专用结构体,像sockaddr_in、sockaddr_in6等等。
// 参数三:协议地址的大小
bind()函数为服务器套接字绑定本地地址/端口,

六、setsockopt()

// 函数功能:设置套接字描述符的属性。成功时返回0,失败时返回-1。
// int setsockopt (int sockfd, int __level, int __optname,const void *__optval, socklen_t __optlen)
// sockfd:要设置的套接字描述符。
// level:选项定义的层次。或为特定协议的代码(如IPv4,IPv6,TCP,SCTP),或为通用套接字代码(SOL_SOCKET)。
// optname:选项名。level对应的选项,一个level对应多个选项,不同选项对应不同功能。
// optval:指向某个变量的指针,该变量是要设置新值的缓冲区。可以是一个结构体,也可以是普通变量
// optlen:optval的长度。

七、ioctl()

int ioctl (int __fd, unsigned long int __request, …) __THROW;
// 作用:配合驱动层的IOCTL函数实现指令的传递
// 参数1:设备描述符
// 参数2:指令,如某一个命令对应驱动层的某一个功能
// 参数3:可变参数,跟命令有关,传递进入驱动层的参数或者是接收数据的缓存
// 返回成功:0
// 返回失败:小于0 返回值取决于用户如何设计驱动层

八、connect()

int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
//connect()函数用于客户端,旨在连接套接字和服务器端的IP地址和端口。
// 参数一:调用socket函数返回的文件描述符
// 参数二:要绑定的给此描述符的协议地址,此处定义了一个宏,原型是const struct sockaddr *,sockaddr 是一个通用结构体,可以包含多种类型的协议地址,但是也带来了使用不便的影响,后又针对具体的协议,制定了不同的专用结构体,像sockaddr_in、sockaddr_in6等等。
// 参数三:协议地址的大小
客户端调用connect()函数先指明目的地址/端口,然后就可以使用send()函数向目的地址发送数据了,因为此时套接字已经包含目的地址/端口,也就是send()函数已经知道包含目的地址/端口。

九、recv()族

// recv(),recvfrom(),recvmsg()调用被用于从套接字接收消息。 它们可用于在无连接和面向连接的套接字上接收数据。
// 正如,recv()和read()之间的唯一区别是标志的存在,使用零标志参数时,recv()通常等效于read()。
// 同理,recv(sockfd,buf,len,flags)等价于recvfrom(sockfd,buf,len,flags,NULL,NULL)。
//用来从一个socket接收消息的,不同之处在于recvfrom和recvmsg可以用在已经建立连接的socket,也可以用在没有建立连接的socket,关于建立连接的socket,简单来说就是有没有调用connect,调用了bind的socket也可以。
// sock:索引将要从其接收数据的套接字。
// buf:存放消息接收后的缓冲区。
// len:buf所指缓冲区的容量。
// flags:是以下一个或者多个标志的组合体,可通过or操作连在一起
//from:指向存放对端地址的区域,如果为NULL,不储存对端地址。

十、poll ()

/poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
// 0 ,表示有事件发生的文件描述符的个数,可以去遍历fds,看哪个fd发生事件,并且根据对应的revent做下一步处理
// ret == 0,表示超时,且还没有事件发生
// ret<0,表示失败,可以根据全局变量errno来判断下一步的动作
//*fds:是一个数组,将所有需要监听的文件描述符以及事件类型放在数组中,交给poll
// nfds_t nfds:需要监听的文件描述符的个数,不是数组的长度
// int timeout:超时时间,等待多久

十一、send()族

// ssize_t send(int sockfd, const void *buf, size_t len, int flags);
// 函数功能:向对方发送数据
// 其实也可以使用sendto函数:
// ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);,如果sendto后面的两个参数为NULL和0时与send函数的作用是等价得。
// sendto函数一般用作UDP通信 send tcp
// 返回值:
// 成功:返回发送的字节数
// 失败:返回-1 且errno被设置
// 函数参数
// a. sockfd 用于通信的文件描述符
// 服务器:sockfd为accept返回的通信描述符
// b. buf 应用缓存,用于存放要发送到数据
// 可以是任何类型:结构体,int , char,float,字符串
// c. len buf的大小
// d. flags 一般设置为0,此时send为阻塞式发送
//dest_addr 指向存放对端地址的区域,如果为NULL,不储存对端地址。

十二、signal()

//signal(int sig, signal_callback_handler);//用于捕获信号,可指定信号处理的方式,sig指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。第二个参数描述了与信号关联的动作,
//执行上述代码时,按下CTRL + C 后程序退出。

十三、memset()

//用来初始化char类型的数组的
// void *memset(void *str, int c, size_t n)
// str – 指向要填充的内存块。
// c – 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式(char)。
// n – 要被设置为该值的字符数。
// 返回值:
// 该值返回一个指向存储区 str 的指针。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值