网络编程的一些函数

#include <sys/types.h>
#include <sys/socket.h>
函数原型:(创建一个套接口)
int socket(int family,    // 协议类型,一般为AF_INET

int type,      // socket类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET

int protocol  // 用来指定socket所使用的传输协议编号,通常设为0即可,表示缺省

);                // 若无错误发生,socket()返回引用新套接口的描述字; 否则,返回INVALID_SOCKET错误

#include <sys/types.h>

#include <sys/socket.h>

函数原型:(通过给一个未命名套接口分配一个本地名字来为套接口建立本地捆绑(主机地址/端口号))

int bind(int sockfd,                          // socket描述符

            struct sockaddr *my_addr,  // 是一个指向包含有本机ip地址和端口号等信息的sockaddr类型的指针

            int addrlen                        // 常被设为sizeof(struct sockaddr)

           );                                      // 返回:成功返回0,失败返回-1

#include <sys/socket.h>

函数原型:(创建一个套接字并监听申请的连接。仅适用于支持连接的套接口,如SOCK_STREAM类型的)

int listen(int sockfd,    // socket()系统调用返回的socket描述符

int backlog   // 指定在请求队列中的最大请求数,进入的连接请求将在队列中等待accept()它们。

);                // 如无错误发生,返回0;否则返回-1

#include <sys/types.h>

#include <sys/socket.h>

函数原型:

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen)
           sockfd: 目的服务器的socket描述符
           serv_addr:包含目的机器ip地址和端口号的指针
           addrlen:sizeof(struct sockaddr)

#include <sys/types.h>
       #inlcude <sys/socket.h>
       函数原型:
       int accept(int sockfd, void *addr, int addrlen)
           sockfd:是被监听的socket描述符
           addr:通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息
           addrlen:sizeof(struct sockaddr_in)

#include <sys/socket.h>
        函数原型:
        int send(int sockfd, const void *msg, int len, int flags);
           sockfd:用来传输数据的socket描述符
           msg:要发送数据的指针 
           flags: 0

#include <sys/types.h>
        #include <sys/socket.h>
        函数原型:
        int recv(int sockfd, void *buf, int len, unsigned int flags)
          sockfd:接收数据的socket描述符
          buf:存放数据的缓冲区
          len:缓冲的长度
          flags:0

read() write()
       int read(int fd, char *buf, int len)
       int write(int fd, char *buf, int len)

shutdown()
       close(sockfd)
       int shutdown(int sockfd, int how)

#include <sys/socket.h>

ssize_t recvfrom(int sockfd, void *buf, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t *addrlen);

// 成功则返回读、写的字节数,出错则为-1。

第一个参数sockfd:描述符;

第二个参数buff:指向读入或写出的缓冲区的指针;

第三个参数nbytes:读写字节数;

第四个参数flags:调用操作方式;

第五个参数from/to:指向数据报发送者或接收者的协议地址(如IP地址和端口号)的套接字地址结构;

第六个参数addrlen:from/to参数的大小。

int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);  // 获取与某个套接字关联的本地协议地址

int getpeername(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);  // 获取与某个套接字关联的外地协议地址

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int inet_aton(const char *string, struct in_addr*addr);  // 字符串有效返回1,否则返回0

int inet_pton(int af, const char *src, void *dst);  // 将“点分十进制”字符串 -> “二进制整数”  参数af为AF_INET或AF_INET6

char* inet_ntoa(struct in_addr in);  // 返回点分十进制字符串

const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);

struct in_addr {

in_addr_t s_addr;

};

结构体in_addr 用来表示一个32位的IPv4地址。

in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序,即该无符号整数采用大端字节序。

其中每8位代表一个IP地址位中的一个数值。

#include <sys/select.h>

int select(int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

maxfdpl:   是一个整数值,是指集合中所有文件描述符的范围,即所有文件描述符的最大值加1。

readset:   (可选)指针,指向一组等待可读性检查的套接口。

writeset:  (可选)指针,指向一组等待可写性检查的套接口。

exceptset:(可选)指针,指向一组等待错误检查的套接口。

timeout:    select()最多等待时间,对阻塞操作则为NULL。

函数返回:若有就绪描述符则为其数目;超时则为0;出错则为-1(如捕获到中断信号)。

#include <sys/epoll.h>

int epoll_create(int size);

// 创建一个epoll的句柄(epoll专用的文件描述符),size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event event);  // 该函数用于控制某个文件描述符上的事件,可以注册事件,修改事件,删除事件。

第一个参数epfd:是epoll_create()的返回值;

第二个参数op:表示动作(要进行的操作):EPOLL_CTL_ADD:注册新的fd到epfd中;EPOLL_CTL_MOD:修改已经注册的fd的监听事件;EPOLL_CTL_DEL:从epfd中删除一个fd;

第三个参数fd:是需要监听的fd;

第四个参数:是告诉内核需要监听什么事;

struct epoll_event {

__uint32_t events; /* Epoll events */

epoll_data_t data;  /* User data variable */

};

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout); // 等待事件的产生(用于轮询I/O事件的发生),类似于select()调用。

第一个参数epfd:由epoll_create 生成的epoll专用的文件描述符;

第二个参数events:用来从内核得到事件的集合;

第三个参数maxevents:表示每次能处理的最大事件数(其值不能大于创建epoll_create()时的size);

第四个参数timeout:是超时时间(毫秒,0会立即返回,-1永不超时,或是永久阻塞,直到有事件产生才触发)。

该函数返回需要处理的事件数目,返回0表示已超时,错误返回-1。

#include <signal.h>

signal(参数1,参数2);

参数1:处理的信号。系统的信号一般为宏定义。

参数2:处理的方式(是系统默认还是忽略还是捕获)。

例如signal(SIGINT ,SIG_ING);

SIG_ING 代表忽略SIGINT信号,SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。发送给所有ForeGround Group的进程。

时间: 2024-08-01 17:35:11

网络编程的一些函数的相关文章

Linux网络编程2&mdash;&mdash;系统函数

socket信息数据结构 #include <netinet/in.h> struct sockaddr { unsigned short sa_family; /*地址族*/ char sa_data[14]; /*14字节的协议地址,包含该socket的IP地址和端口号.*/ }; struct sockaddr_in { short int sa_family; /*地址族*/ unsigned short int sin_port; /*端口号*/ struct in_addr sin

【网络编程】——connect函数遇见EINTR的处理

最近在公司项目中突然报错如下 “connect: Interrupted system call”, 经过查找代码发现是在创建 socket 中执行了 connect 函数失败导致.上网查阅资料发现这是 信号中断EINTR 与 慢系统调用 的问题. 慢系统调用:可能永远阻塞的系统调用. EINTR说明:如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“In

网络编程I/O函数介绍

read和write #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); 参数: fd: 文件描述符 buf:数据缓冲区,用于保存要从fd读取或写入的数据 count:输入/写入的数据最大字节数.(实际读取或写入的数据大小可能小于count) 返回值: 正常情况下返回读取或写入的真正的数据大小 返回0表示没

linux网络编程:select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

从别人的博客中转载过来了这一篇文章,经过重新编辑排版之后展现于此,做一个知识点保存与学习. select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: int select(int maxfd,fd_set *rdset,fd_set *wrset,fd_set *exset,struct timeval *timeout); 所在的头文件为:#include <sys/time.h> 和#include <uni

Python中网络编程对 listen 函数的理解

listen函数的第一个参数时SOCKET类型的,该函数的作用是在这个SOCKET句柄上建立监听,至于有没有客户端连接进来,就需要accept函数去进行检查了,accept函数的第一个参数也是SOCKET类型,跟listen函数是同一个socket句柄,所以一般accept都是放在一个线程中不停的调用,因为我们无法知道什么时候会有客户端连接进来. listen的socket对象比喻为火车站 accept的socket对象理解需要接待的旅客 如果要接到旅客,首先要到火车站等待(即listen监听的

C/C++网络编程2——socket函数

本节主要介绍创建套接字的socket函数. #include <sys/socket.h> int socket(int domain, int type, int protocol); // 创建成功返回文件描述符,创建失败返回-1 domain : 套接字中使用的协议族 PF_INET : IPv4互联网协议族,常用的是这个 PF_INET6 : IPv6互联网协议族 PF_LOCAL : 本地通信的UNIX协议族 PF_PACKET : 底层套接字的协议族 PF_IPX : IPX No

网络编程中select函数的教训

先看一代码: fd_set readfs,writefs; int maxfd = -1; struct timeval tp; int nret = 0; unchar brcvbuf[2048]; tp.tv_sec = 2; tp.tv_usec = 0; FD_ZERO(&readfs); FD_ZERO(&writefs); FD_SET(g_isockid, &readfs); /* g_isockid 为要检测的socket*/ maxfd = Max(maxfd,

linux 网络编程 inet_pton &amp; inet_ntop函数

#include <arpa/inet.h> int inet_pton(int family,const char * strptr,void * addrptr); 返回:1--成功, 0--输入不是有效的表达格式 , -1--出错 const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len); 其中len =sizeof(* strptr) 返回: 指向结果的指针--成功 , NULL--

16 网络编程 - 《Python 核心编程》

?? 引言:客户/服务器架构 ?? 套接字:通信终点 ?? 面向连接与无连接套接字 ?? Python 中的网络编程 ?? Socket 模块 ?? 套接字对象方法 ?? TCP/IP 客户端和服务器 ?? UDP/IP 客户端和服务器 ?? SocketServer 模块 ?? Twisted 框架介绍 ?? 相关模块 16.1 介绍 什么是客户/服务器架构? 服务器是一个软件或硬件,用于提供客户需要的“服 务”. 服务器存在的唯一目的就是等待客户的请求,给这些客户服务,然后再等待其它的请求.