linux下网络编程(TCP连接的建立)
一、TCP服务器和客户端的创建
tcp服务器和客户端的创建流程如下图:
服务器端
- socket指定套接字的协议类型,是ipv4还是ipv6,是tcp还是udp;
- bind将socket套接字和服务器地址绑定;
- listen用于开启服务器的监听功能;
- accept用于接收新的客户端的连接,每接收到一个新的客户端,accept都会为其创建一个新的唯一的套接字,并记录客户端的地址;
- recv和send在有客户端连接的情况下使用;
- close关闭指定的套接字对应的客户端的连接;
客户端
- socket指定套接字的协议类型,是ipv4还是ipv6,是tcp还是udp;
- connect指定需要连接的服务器地址;
- 连接成功之后调用recv和send进行数据通信;
- close关闭指定的套接字对应的客户端的连接
二、相关函数
- socket函数
函数原型:int socket(int domain, int type, int protocol);
头文件: #include <sys/types.h> #include <sys/socket.h>
函数功能:创建一个socket套接字
函数参数:domain指定套接字类型,具体值如下:AF_UNIX, AF_LOCAL 本地通信 unix(7)AF_INET IPv4通信协议 ip(7)AF_INET6 IPv6通信协议 ipv6(7)AF_IPX IPX互联网分组交换协议AF_NETLINK 内核和用户空间交互 netlink(7)AF_X25 ITU-T X.25 / ISO-8208 protocol x25(7)AF_AX25 Amateur radio AX.25 protocolAF_ATMPVC Access to raw ATM PVCsAF_APPLETALK AppleTalk(苹果公司的一种通信协议) ddp(7)AF_PACKET Low level packet interface packet(7)AF_ALG Interface to kernel crypto APItype指定协议类型,具体值如下:SOCK_STREAM 提供一种连续的、可信任的、双向的字节流,使用TCP协议需要指定该选项SOCK_DGRAM 提供一种固定长度的数据报文,使用udp协议需要指定该选项SOCK_SEQPACKET Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixedmaximum length; a consumer is required to read anentire packet with each input system call.SOCK_RAW 提供数据链路层的原始数据,可以供用户自己实现上层应用协议SOCK_RDM 提供一种可信赖的数据包传输,但是不保证顺序SOCK_PACKET Obsolete and should not be used in new programs; seepacket(7).protocol这个参数用来给socket指定一个特殊的协议,如IPPROTO_IP、IPPROTO_UDP、IPPROTO_TCP、IPPROTO_ICMP,这个参数通常设置为0,系统会根据前两个参数自动设置具体的协议。
- bind函数
函数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
函数功能:将socket套接字和地址绑定
函数参数:sockfd 套接字描述符addr 地址,类型为:struct sockaddr {sa_family_t sa_family;char sa_data[14];}
3.listen函数
函数原型:int listen(int sockfd, int backlog);
函数功能:这个函数只用在服务器端,用来监听客户端的连接请求,使用backlog指定允许处理的最大连接请求数,如果请求连接的客户端个数超过backlog,请求会被拒绝
函数参数:sockfd 套接字描述符backlog 最大允许请求连接的客户端数量
4、accept函数
函数原型: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数功能:这个函数只用在服务器端,用于监视是否有新的客户端请求连接,如果有新的客户端连接,accept会为其创建一个新的socket套接字,并唯一标识这个新的客户端与服务器的连接通道。
函数参数:sockfd 套接字描述符addr 新连接客户端的地址
5、recv、recvfrom和recvmsg
函数原型:ssize_t recv(int sockfd, void *buf, size_t len, int flags);ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
函数功能:这三个函数都可以接收网络数据,recv和recvfrom的区别在于recvfrom可以记录发送方的地址,recv相当于recvfrom(sockfd,buf,len,flas,ULL,NULL)
函数参数:sockfd 套接字描述符buf 接收数据缓冲区len 缓冲区长度flas 接收参数,常用值如下:MSG_DONTWAIT 设置为非阻塞接收,函数调用后不管有没有数据立即返回,默认为阻塞接收MSG_WAITALL 阻塞接收MSG_OOB 可以接收和发送带外数据MSG_PEEK:表示只是从缓冲区读取内容而不清除缓冲区,也就是说下次读取还是相同的内容。
返回值:成功返回接收到的字节数,失败可以通过查询errno的值来获取原因
6、connect函数
函数原型:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
函数功能:连接指定的服务器
7、send和sendto
函数原型ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
函数功能:发送tcp数据,send只能用于tcp数据的发送,sendto相当于sendto(sockfd, buf, len, flags, NULL, 0);
linux下网络编程(TCP连接的建立)相关推荐
- Linux下网络编程
Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...
- linux网络编程-----TCP连接及相关问题
c/s模型在建立连接时的流程如下 //服务器端 int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr; bz ...
- Linux tcp同时多个连接,Linux下网络编程(2)——TCP多连接,1个server,多个client...
1. 前言 本次使用TCP连接,1个server,多个client. server和多个client之间,可以互相发送消息. 2. 代码 tcp_sever_fork.cpp 如下: #includ ...
- linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现
一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...
- linux下socket编程-TCP
网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出 ...
- linux 下网络编程 聊天室项目
服务端使用框架:非阻塞轮询: 客户端使用框架:多线程: 使用数据库:mysql: 实现主要功能: 1.注册: 2.登录: 3.群聊: 4.私聊: 5.查看聊天记录: 6.查看在线人数: 7.修改个性签 ...
- linux 内核udp编程,Linux下网络编程实现UDP,还有大量实例
[1]概念 [2]程序流程 [3]相关函数 1)创建套接字 2)绑定网络信息结构体 3)接受数据 4)发送数据 [4]项目:基于udp 的网络聊天室 [1]概念 UDP(User Datagram P ...
- linux进程内存结构体,Linux下网络编程(3)——进程间通信(IPC),共享内存,传递结构体数据...
1. 前言 多进程,总有一些交互要做,不可能各自独立. 这里是最简单的例子.一个写入,一个读取. 一个建立共享内存,写入数据. 一个读取共享内存的内容. 2. 简单例子代码 twriter.cpp 代 ...
- Qt:Qt实现Winsock网络编程—TCP服务端和客户端通信(多线程)
Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 前言 感觉Winsock网络编程的api其实和Linux下网络编程的api非常像,其实和其他编程语言的网络编程都差不太多.博主用Qt ...
最新文章
- mysql之存储引擎的选择
- SQL优化基础 使用索引(一个小例子)
- Mule web service调用中的复杂类型传递
- “逃离”单体,GitHub的微服务架构实践
- UnityEngine.UI.dll 路径
- python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3
- GAN也有脾气:「太难的部分我就不生成了,在下告退」
- linux运维 对比 网络_linux - 终端下查看网络实时吞吐量
- opencv contourArea() 计算面积(转)
- Bailian4136 矩形分割【差分】
- 停车场管理系统软件详细设计说明书
- 有关CATIA软件的几个使用技巧
- 教你如何用两个栈实现一个队列
- 33、什么是 AIO?
- 2021年中国DDI(DNS-DHCP-IPAM)解决方案市场趋势报告、技术动态创新及2027年市场预测
- SICTF2023 Osint-wp
- Linux系统安全加固指南(万字长文)
- java8 Arrays.sort 与Arrays.parallelSort
- JAVA——J2EE之Servlet 基础篇(一)
- flex blazeds java_Flex+BlazeDS+java通信详细笔记
热门文章
- 前端模块化 CommonJs、AMD、CMD、UMD、ESmodule 发展历程与关系
- c语言中赋值的时候顿号的作用,简单总结C语言中的运算符优先级
- datepart函数用法及其与sqlserver depart函数、Mysql week函数的差异
- Code signing is required for product type 'Application' in SDK 'iOS 12.2'
- php是面向对象还是过程,PHP面向过程和面向对象
- Google Earth Engine(GEE)——sentinel2数据介绍
- latex 三线表 与调整表格与上下文的间距
- Servlet 过滤器( Filter )
- Linux性能监控的常用工具/命令
- ARM DS-5单步调试ARM64 linux 内核