
Linux网络函数
注意:如果不使用bind绑定客户端地址结构, 采用"隐式绑定".
发布日期:2021-05-07 02:41:59
浏览次数:24
分类:精选文章
本文共 2413 字,大约阅读时间需要 8 分钟。
socket模型流程

- TCP/IP协议规定:网络字节流采用大端字节序(电脑中一般是小段存储) (1):大端:低地址 -> 高字节 (1):小端:低地址 -> 低字节
- linux下的转换函数
(1)字节序的转换
#includeuint32_t htonl(uint32_t hostlong);//本地(host)到网络 (network)ip uint16_t htons(uint16_t hostshort); // 本地到网络 port uint32_t ntohl(uint32_t netlong); //网络到本地 ip uint16_t ntohs(uint16_t netshort); //网络到本地port
(2)字符串IP和网络字节序转换
#include/*af: IP版本 AF_INET->Ipv4 AF_INET->Ipv6 src:要转的字符串 dst:网络地址的结构体指针*/int inet_pton(int af, const char *src, void *dst);//字符串 -> 网络字节序/*af: IP版本 AF_INET->Ipv4 AF_INET->Ipv6 src:要转的网络字节序 dst:指向存放ip字符串的buf size:buf的大小*/const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);//网络字节序 -> 字符串
- sockaddr数据结构
//以前版本struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */};//现在版本struct sockaddr_in { sa_family_t sin_family; /* Address family : AF_INET*/ 地址结构类型 in_port_t sin_port; /* Port number in network byte order */ 端口号 struct in_addr sin_addr; /* Internet address */ IP地址};struct in_addr { uint32_t s_addr; /* Internet address in network byte order*/};
struct sockaddr_in addr; addr.sin_family=AF_INET; addr.sin_port=htons(8888); addr.sin_addr.s_addr=htonl(INADDR_ANY);
(1)socket函数:创建套接字
/*domain: AF_INET | AF_INET6 | AF_UNIX(本地)type: SOCK_STREAM(流式) | SOCK_DGRAM(报式)protocol: 0(默认,自动选择流式or报式典型协议:tcp | udp)成功:返回指向新创建的socket的文件描述符*/socket(int domain, int type, int protocol)
(2)bind函数:绑定IP+Port
/*sockfd:需要绑定的socket文件描述符addr:(传入参数)指定自己的IP地址和端口号addrlen:结构体大小成功:0失败:-1 errno*/int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
(3)listen函数:设置服务器同时允许客户端建立连接的数目
/*sockfd : socket文件的描述符backlog : 指定同时建立连接的客户端数目(上限数值)成功:0失败:-1 errno*/int listen(int sockfd, int backlog)
(4)accept函数:接收一个socket连接请求(阻塞监听)
阻塞等待客户端建立连接,成功的话,返回一个与客户端成功连接的socket文件描述符
/*sockfd:socket函数返回值addr: (传出参数)成功与服务器建立连接的那个客户端的地址结构(用来存放客户端IP+Port信息)addrlen: 传入、传出参数,传入addr结构体的大小,传出真正的结构体内部大小返回值: 成功:能与服务进行数据通信的socket对应的文件描述符 失败:-1 errno*/int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
(5)connect函数:使用现有的socket与服务器建立连接
/*sockfd: 客户端本地的socket文件描述符addr:(传入参数)服务器的IP+Port结构体信息addrlen:传入参数 sizeof(addr)返回: 成功:0 失败:*/connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 03时19分49秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Javascript之旅——第九站:吐槽function
2021-05-09
Javascript之旅——第十一站:原型也不好理解?
2021-05-09
Sql Server之旅——第十站 看看DML操作对索引的影响
2021-05-09
十五天精通WCF——第二天 告别烦恼的config配置
2021-05-09
双十一来了,别让你的mongodb宕机了
2021-05-09
asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析
2021-05-09
Tomcat 热部署
2021-05-09
深入解析 HTTP 缓存控制
2021-05-09
深入浅出访问者模式
2021-05-09
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
2021-05-09
百度前端技术学院task16源代码
2021-05-09
解析js中( ( ) { } ( ) )的含义
2021-05-09
js设计模式总结5
2021-05-09
Python大神编程常用4大工具,你用过几个?
2021-05-09
一文带你了解图神经网络
2021-05-09
9个常用ES6特性归纳(一般用这些就够了)
2021-05-09
3D渲染集群,你了解多少?
2021-05-09
除了方文山,用TA你也能帮周杰伦写歌词了
2021-05-09
关于GO语言,这篇文章讲的很明白
2021-05-09
华为云FusionInsight湖仓一体解决方案的前世今生
2021-05-09