Linux网络编程【socket编程】
网络套接字:socket 在通信过程中,套接字一定是成对出现(listen监听除外)
Linux内核实现套接字通信: 一个文件描述符,两个缓冲区
一个文件描述符指向一个套接字(该套接字内部由内核借助两个缓冲区实现)
网络字节序:
补充知识:数据在内存中存储方式:大端法(高位低地址、低位高地址)、小端法(高位高地址,低位低地址)
网络数据流应采用大端法字节序
网络字节序与主机字节序的转换:
h:本地 n:网络 l:IP s:port(端口)
htonl:本地 ==> 网络(IP)
htons:本地 ==> 网络(PORT)
ntohl:网络 ==> 本地(IP)
ntohs:网络 ==> 本地(PORT)
IP 地址转换函数:点分十进制 == > 网络字节序 man inet_ntp可查看
//manpage函数原型说明
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);参数:af: AF_INET、AF_INET6src: 传入参数,IP地址(点分十进制)dst: 传出参数,转换后的网络字节序的IP地址
socket模型创建流程图
客户端和服务器一共有三个套接字(包含一个listen套接字)
服务器端四个函数依次来看:
socket:创捷一个socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>函数原型:int socket(int domain, int type, int protocol);参数:domain:常用:AF_UNIX Local communication unix(7)AF_INET IPv4 Internet protocols ip(7)AF_INET6 IPv6 Internet protocols ipv6(7)type: 常用:SOCK_STREAM 流式 TCP SOCK_DGRAM 报式 UDPprotocol:0返回值:成功:新套接字所对应的文件描述符失败:-1,并设置errno
bind:给socket绑定一个地址结构
#include <sys/types.h>
#include <sys/socket.h>函数原型:int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
结构体:struct sockaddr *addr 通常使用 struct sockaddr_in addr 来替代
struct sockaddr_in addr:使用 man 7 ip 可以查看结构体成员变量struct sockaddr_in {sa_family_t sin_family; /* address family: AF_INET */in_port_t sin_port; /* port in network byte order */struct in_addr sin_addr; /* internet address */};/* Internet address. */struct in_addr {uint32_t s_addr; /* address in network byte order */};参数:sockfd:socket函数返回值addr:(struct sockaddr *)&addr 需要强制类型转换addrlen:sizeof(addr)返回值:成功:0失败:-1 设置errno
listen:设置同时与服务器建立连接的上限数(同时进行3次握手的客户端数量)
#include <sys/types.h>
#include <sys/socket.h>函数原型:int listen(int sockfd, int backlog);参数:backlog(最大不超过128):上限数值
accept:阻塞等待客户端建立连接,成功的话返回一个与客户端成功连接的sockfd
#include <sys/types.h>
#include <sys/socket.h>函数原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);参数:addr:传出参数,成功与服务器建立连接的那个客户端的地址结构socklen_t client_addr_len = sizeof(addr);addrlen:传入传出参数&client_addr_len返回值:成功:能与服务器进行数据通信的socket对应的文件描述符失败:-1, errno
TCP serve代码实现:
#define SERV_PORT 9999
int main(int argc, char *argv[])
{int lfd, cfd;int ret;int i;char buf[BUFSIZ], clint_IP[1024]; //BUFSIZ:8192struct sockaddr_in serv_addr, clit_addr;socklen_t clit_addr_len;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(SERV_PORT);serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);lfd = Socket(AF_INET, SOCK_STREAM, 0);Bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));Listen(lfd, 128);clit_addr_len = sizeof(clit_addr);cfd = Accept(lfd, (struct sockaddr *)&clit_addr, &clit_addr_len);printf("clint ip:%s port:%d\n", inet_ntop(AF_INET, &clit_addr.sin_addr.s_addr, clint_IP,sizeof(clint_IP)),ntohs(clit_addr.sin_port));/*实现客户端发送数据 服务器进行大小写转换 最后输出给客户端 打印在屏幕上*/while(1){ret = read(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, ret);for(i = 0; i< ret; i++) {buf[i] = toupper(buf[i]);}write(cfd, buf, ret);}return 0;
}
客户端函数模型
connect:与客户端建立连接
#include <sys/types.h>
#include <sys/socket.h>函数原型:int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
在客户端之所以没有bind就可以和服务器建立连接
原因是因为系统采用“隐式绑定”
TCP client代码实现:
int main(int argc, char *argv[])
{int cfd;int conter = 10;char buf[BUFSIZ];int ret;struct sockaddr_in serv_addr; //server ip + portserv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(9999);inet_pton(AF_INET, "127.1", &serv_addr.sin_addr.s_addr);cfd = Socket(AF_INET, SOCK_STREAM, 0);ret = Connect(cfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));if(ret == -1) {exit(1);}while(conter--) {write(cfd, "hello\n", 6);sleep(1);ret = read(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, ret);}close(cfd);return 0;
}
在这里我封装了出错处理函数 如需要函数源码可以私信我
TCP流程分析
serve client
socket() socket()
bind()
listen()
accept() connect()
read() write()
toupper() read()
write() 显示读取结果
close() close()
Linux网络编程【socket编程】相关推荐
- [linux] Linux网络之Socket编程入门
目录 1. 前言 2. 网络基础 2.1 协议 2.1.1 TCP和UDP协议 2.2 网络的层状结构 2.3 一台主机向另一台主机的发送数据的流向 2.4 IP和MAC地址 2.5 端口 2.6 网 ...
- Linux网络原理与编程——第十一节 网络基础及套接字
目录 一.网络的层状划分结构 二.网络发展史 三.协议 四.OSI七层结构模型 五.TCP/IP四层(五层)协议结构模型 六.局域网中通信原理初识 封包.解包.分用.mac帧 七.跨网络通信原理初始 ...
- Linux下简单socket编程
Linux下简单socket编程 socket的英文翻译是接口.插座的意思,很形象,就相当于将两个台电脑用一根线连起来,线的两头分别是插头,插在两台电脑上,借此实现通信. 两台电脑通信,实际上是这两台 ...
- Java网络编程——Socket 编程
Socket 编程 Socket编程是在TCP/IP上的网络编程,但是Socket在上述模型的什么位置呢.这个位置被一个天才的理论家或者是抽象的计算机大神提出并且安排出来 我们可以发现Socket就在 ...
- Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
目录 套接字编程 Sockaddr结构 字节序 地址转换 常用套接字接口 UDP的通信流程 UDPSocket的封装 UDP服务器 UDP客户端 套接字编程 所谓套接字(Socket),就是对网络中不 ...
- linux C语言 socket编程教程(附两个例子)(socket教程)
文章目录 1.网络中进程之间如何通信? 2.什么是Socket? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 网络字节序与主机字节序 3.3.listen(). ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层模 ...
- Linux学习之socket编程(一)
socket编程 socket的概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP地址+端口号"就称为sock ...
- 初识网络及socket编程基础
理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址. 源ip地址就是发送端ip,目的ip地址就是接收端ip 思考: 我们光有IP地址就可以完成通 ...
- 网络基础+Socket编程+高并发服务器
网络编程 P1 复习 Linux 网络编程 P2 信号量生产者复习 P3 协议 P4 七层模型和四层模型及代表协议 P5 网络传输数据封装流程 P6 以太网帧和ARP请求 P7 IP 协议 P8 TC ...
最新文章
- APC UPS网络管理卡 (AP9606/9617/9618/9619)的快速安装及配置指南
- [xsy2880]取石子游戏
- 裸辞,迎接2019年的春天
- 关于ESXI能虚拟出多少个虚拟机和CPU的关系
- (分组交换时延)谢希仁 第七版第一章1-10题详细解答
- rac下重做控制文件
- CodeForces - 1307B Cow and Friend(数学+思维)
- 为什么更改总和顺序会返回不同的结果?
- 每天一算法(一)——用链表实现加减乘运算
- sqlserver数据库分组查询
- 计算机培训短期速成班,【电脑基础班、速成班、短期班、计算机一级培训班】价格,厂家,电子商务-搜了网...
- 360linux 杀毒软件,Linux下用360安全卫士/360杀毒国产系统适配专版显示有木马或是误报...
- hyperledger java_hyperledger fabric 1.4 使用java开发智能合约
- 30个有发展前景的创业项目
- 斯坦福大学-自然语言处理入门 笔记 第十四课 CGSs和PCFGs
- 中英离线翻译mac_Instant Translate for Mac-即时翻译Mac版下载 V1.3.0-PC6苹果网
- 【校招VIP】前端校招考点之页面转换算法
- 【C++】—— STL简介(了解)
- linux系统横杆,linux横杠怎么打
- Shell中获取当前脚本的绝对路径: $( cd “$( dirname “${BASH_SOURCE[0]}“ )“ pwd)
热门文章
- Android studio历史版本下载
- python爬取有声小说_200行代码实现一个有声听书网爬虫下载器
- 把自己坑的Could not invoke service..
- 创业板暂停上市的条件
- 扫描后,PDF文件不会手写电子签名?教你一招
- 基于JAVA的闲置物品交换平台的设计与实现
- 平板电脑什么牌子好?看完这组图片更爱他了
- [推荐]如何设置微信公众号客服消息实时提醒,及在微信中回复粉丝留言
- “远程桌面出现身份验证错误,要求的函数不受支持”解决方案
- 【论文学习】ASVspoof 2015 the First Automatic Speaker Verification Spoofing and Countermeasures Challenge