网络编程基础API

2023-11-07

基础API

  • signal函数
#inculde<signal.h>
void (*signal(int signo, void (*func) (int))) (int);
  • socket函数
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
// domain 底层协议族,PF_INET--> IPv4 ,PF_INET6-->IPv6
// type 服务类型 SOCK_STREAM流服务,SOCK_UGRAM数据报
// protocol 协议
  • 地址
struct sockaddr_in {
	sa_family_t sin_family; // 地址族:AF_INET
	u_int16_t sin_port; //端口号,要用网络字节序
	struct in_addr sin_addr; //IPv4地址结构体
};
struct in_addr {
	u_int32_t s_addr; //IPv4地址,网络字节序表示

};
  • IP地址转换
#include<arpa/inet.h>
int inet_pton( int af, const char* stc, void* dst );
const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);

inet_pton将字符串表示的IP地址src转换为网络字节序IP,并把结果存在dst指向的内存中。
inet_ntop相反

#include<arpa/inet.h>
in_addr_t inet_addr (const char* strptr);
int inet_aton(const char* cp, struct in_addr* inp);
char* inet_ntoa(struct in_addr in);
  • 主机字节序与网络字节序
#include<netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htonl(unsigned short int hostlong);
unsigned long int ntohl(unsigned long int hostlong);
unsigned short int ntohl(unsigned short int hostlong);
  • bind
#include<sys/types.h>
#include<sys/socket.h>
int bind (int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);

bind将mmy_addr所指的socket地址分配给为未命名的sockfd文件描述符.
errno99:绑定地址或端口有问题

  • listen
#include<sys/scoket.h>
int listen(int sockfd, int backlog);

sockfd指定被监听socket。backlog指定监听最大长度。

  • accept
#include<sys/types.h>
#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t* addrlen);

sockfd是执行过listen系统调用的监听sockfd。accept只是从监听队列中取出连接,而不论连接处于何种状态,更不关心任何网络状况的变化。

  • connect
#include<sys/types.h>
#include<sys/socket.h>
int connect (int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
  • close
#include<unistd.h>
int clost(int fd);

close系统调用并非总是立即关闭一个连接,而是将fd的引用计数减1。当计数为0,才关闭。
立即终止使用shutdown

  • TCP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recv(int sockfd, void* buf, size_t len, int flags);
ssize_t send(int sockfd, const void* buf, size_t len, int flags);

recv读取sockfd上的数据,buf和len分别指定缓冲区位置和大小。recv成功时返回读取的数据长度。flags额外控制。

  • UDP读写
#include<sys/types.h>
#include<sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int falgs, struct sockaddr* src_addr, socklen_t * addrlen);
ssize_t sendto(int sockfd, void *buf, size_t len, int falgs, cosnt struct sockaddr* dest_addr, socklen_t * addrlen));
  • 通用数据读写函数
#include<sys/scoket.h>
ssize_t recvmsg(int sockfd, struct msghdr* msg, int flags);
ssize_t sendmsg(int scokfd,struct msghdr*msg, int flags);
struct msghsr {
	void* msg_name:
	socklen_t msg_namelen;
	struct iovec* msg_iov;
	int msg_iovlen;
	void* msg_control;
	socklen_t msg_controllen;
	int msg_flags;
};
struct iovec {
	void *iov_base;
	size_t iov_len;
};
  • 地址信息函数
#include<sys/socket.h>
int getsockname(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);
int getpeername(int sockfd, stuct sockaddr* addresss, socklen_t * address_len);

getsockname获取sockfd对应的本端socket地址,并将其存储与addresss
getpeername获取sockfd对应的远端socket地址

  • socket选项
#include<sys/socket.h>
int getscokopt(int sockfd, int level, int option_name,void *option_value, socklen_t* restrict option_len);
int setscokopt(int sockfd, int level, int option_name,const void *option_value, socklen_t* restrict option_len);
  1. SO_REUSEADDR 可以用来强制使用被处于TIME_WAIT状态的连接占用的socket地址
  2. SO_RCVBUF和SO_SNDBUF
  3. SO_RCVLOWAT和SO_SNDLOWAT
  4. SO_LINGER
  • 网络信息API
  1. gethostbyname和gethostbuaddr
#include<netdb.h>
sturct hostent* gethostbyname(const char* name);
struct hostent* gethostbyaddr(const void* addr, size_t len, int type);
struct hosten {
	char *h_name;
	char** h_aliases;
	int h_addrtype;
	int h_length;
	char **h_addr_list;
};
  1. getservbyname和getservbyport
#include<netdb.h>
struct servent*getservbyname(const char* name, cosnt char* proto);
sturct servent* getservbyport(int port, const char* proto);
struct servent {
	char* s_name;
	char** s_aliases;
	int s_port;
	char *s_proto;
};
  1. getaddrinfo
#include<netdb.h>
int getaddrinfo(cosnt char* hostname, const char* service, cosnt struct addrinfo* hints, struct addrinfo** result);
struct addrinfo {
	int ai_flags;
	int ai_family;
	int ai_socktype;
	int ai_protocol;
	socklen_t ai_addrlen;
	char* ai_canonname;
	struct sockaddr* ai_addr;
	struct addrinfo* ai_next;
};
  1. getnameinfo
#include<netdb.h>
int getnameinfo(const struct sockaddr* sockaddr, socklen_t addrlen, char* host, socklen_t hostlen, char* serv, socklen_t servlen, int flags);


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程基础API 的相关文章

随机推荐

  • 函数变更记录表 function_change

    函数变更记录表 datamart function change 表结构 CREATE TABLE datamart function change function name character varying 200 函数名 new p
  • Linux巡检脚本

    linux巡检脚本 转自 http myit icu index php archives 1634 待测试 bin bash Author Dean Date 2021 11 25 E mail deanmr qq com bin bas
  • Application tried to present modally an active controller

    控制器模态到另一个控制器发生了错误 报错是Application 试图模态到一个活跃的控制器中 第一次模态的时候不会出现问题 第二次发生了问题 也就是说明了第二次模态的视图是活跃状态 没有销毁 查找代码 发现了问题 第一次模态之后 控制器不
  • json-server常见问题

    json server搭建本地测试服务器 mock数据 模拟后台数据 现在基本上都是前后端分离 前端是前端工程师 后端属于后端工程师 但是前后端交互是个必不可少的环节 一般用Ajax进行交互 还需要一些实验数据来支撑 就需要模拟数据 1 v
  • Android第二讲笔记(约束布局ConstraintLayout)

    目录 为什么要使用约束布局ConstraintLayout 约束布局基本属性 约束布局简单使用方法 示例 示例一 仿QQ消息 示例二 仿微信登陆界面 示例三 仿QQ音乐界面 补充 写在最后 ScrollView 滚动布局 示例一 纵向滚动
  • 实测C++变量长度、最小值、最大值

    说明 基本的内置变量类型 bool char wchar t int float double 类型修饰符 signed unsigned short long 环境 win7x64 VS2015 Debugx86 测试结果 补充 doub
  • [1190]如何解决Chrome无法访问ftp的问题

    在最新一次Chrome更新中彻底抛弃ftp协议了 之前可以在搜索栏搜索chrome flags 并将Enable support for ftp Urls设置为Enabled才能访问ftp 但是在Chrome96中直接将修改选项剔除了 这代
  • 珠心算测验-NOIP2014普及t1

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术 珠心算训练 既能够开发智力 又能够为日常生活带来很多便利 因而在很多学校得到普及 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法 他随机生成一个正整数集合
  • SpringBoot 项目在Linux服务器上启动、停止脚本(详细)

    SpringBoot 项目在Linux服务器上启动 停止脚本详细 创建脚本 在jar包目录 创建脚本 实际项目只需要修改包名 1 进入可编辑 执行代码 vim xxxxxx sh xxxxxx就是你自己创建的脚本名称 写好后 按下回车后 进
  • C语言

    这篇文章主要和大家分享三种基础的排序算法 冒泡排序 选择排序 快速排序 一 排序问题 1 冒泡排序 冒泡排序的主要思想是通过两两相邻的元素进行比较 通过元素的大小决定是否交换 一趟冒泡排序的结果是一定有一个最大数会排到最后一个元素 因此对n
  • Python中requests包的安装

    在使用pycharm开发的时候 我们经常需要导入一些包 但是这些包 我们事先并没有安装 一个显著的现象就是我们在pycharm中导入一个包时 系统提示不存在 那就是我们没有安装这个包 举一个例子 我在使用pycharm时 需要导入一个req
  • c++ typeid使用

    今天用了下c typeid这个操作符记录一下 class parent void getdata virtual void deal class son public parent int main parent pa new son po
  • How do you install Typecho in Docker and mount hosting server's Mysql service

    Fist of all I presume that you have already installed Docker and Portainer and works smoothly All CLI procdures are base
  • Ubuntu安装GCC 3.4

    Ubuntu安装GCC 3 4 一 背景 二 安装 三 总结 一 背景 因最近学习hit os编译linux 0 11版本内核 需要使用到gcc 3 4 故此记录 二 安装 下载deb包 wget http old releases ubu
  • 如何运用bat脚本批量 重命名/复制 文件

    在平时运维的时候 最繁琐的就是要每个月写运维记录的文档如excel表格 一个月30日要产生30个文件 拷30个运维记录文档的模版再进行重命名实在太麻烦了 所以想到copy模版之后可以用脚本来对文件进行重命名自己想要的效果 首先给出效果图 下
  • 登录和注册页面 - 验证码功能的实现

    目录 1 生成验证码 2 将本地验证码发布成 URL 3 后端返回验证码的 URL 给前端 4 前端将用户输入的验证码传给后端 5 后端验证验证码 1 生成验证码 使用hutool 工具生成验证码 1 1 添加 hutool 验证码依赖
  • Arduino的ESP32搭建方法-亲测OK

    使用乐鑫官方资源搭建基于Arduino的ESP32的开发环境 目录 一 配置IDE管理器 二 自动安装板支持包 三 手动安装板支持包 四 网盘的ESP32全系列基本库的板支持包 使用乐鑫官方库搭建Arduino开发环境 乐鑫官方Github
  • 数码管从0到9再从9到0循环显示

    源程序 include
  • linux中用shell脚本对tomcat和nginx做日志切割

    Tomcat日志catalina out切割小脚本 bin bash cut tomcat catalina out yesterday date F d 1 days cd usr local tomcat7 0 70 log cp ca
  • 网络编程基础API

    基础API signal函数 inculde