【网络编程】TCP/IP (客户端--服务端)
数据链路层: 通过各种控制协议,将有差错的物理信道变为无差错的、能
可靠传输数据帧的数据链路。
MAC(物理地址)48位
网络层: 实现数据包的选路和转发。
IP 地址有分 IPV4 (32位)和 IPV6 (128位)两种类别格式,(主机号和网络号构成)
传输层:传输层为应用层提供过了一个进程间通讯的途径 (TCP/UDP/SCTP)
OSI七层协议,TCP/IP五层协议
寄快递,ip /协议 发送的数据大小有限制。
tcp/ip 面向连接的可靠的 流式服务
- 主机字节序列和网络字节序列
主机字节序列分为大端字节序列(高位数,低地址)和小端字节序列。
两台不同字节序列的主机传递数据,可能会混乱。即:大端字节序列称为网络字节序列。接收方根据自己字节进行转换。
因此整型数据发送到网络,规定为大端序列字节
发送数据的时候,其字节会从(长整型,短整型主机字节转为网络字节),收数据相反。 - linux通过四个函数完成主机字节序列和网络字节序列之间的转换。 头文件:
#include <netinet/in.h>
uint32_t htonl(uint32_t hostlong);// 长整型的主机字节序转网络字节序uint32_t ntohl(uint32_t netlong); // 长整型的网络字节序转主机字节序uint16_t htons(uint16_t hostshort); // 短整形的主机字节序转网络字节序uint16_t ntohs(uint16_t netshort);// 短整型的网络字节序转主机字节
套接字:
通过套接字进行收发数据。(相当于手机)
ip和端口填充到套接字的地址(结构体sockaddr中)
#include <bits/socket.h>
socket
int socket(int domain, int type, int protocol)
//socket()创建套接字,成功返回套接字的文件描述符,失败返回-1
// domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6//type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM//protocol: 一般设置为 0,表示使用默认协议
- 人们习惯用点分十进制字符串表示
IPV4
地址,但编程中我们需要先把它们转化
为整数方能使用,下面函数可用于点分十进制字符串表示的IPV4
地址和网络字节序整数表示的IPV4
地址之间的转换:
IPV6
地址,要用网络字节序表示
bind() 设置主机的ip地址和端口
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//bind()将 sockfd 与一个 socket 地址绑定,成功返回 0,失败返回-1
//sockfd 是网络套接字描述符
//addr 是地址结构 设置ip地址和端口
//addrlen 是 socket 地址的长度
通用套接字地址结构:
sockaddr专用套接字地址结构:
IPV4:
TCP/IP协议族有sockaddr_in
:设置ip端口
IPV6:
sockaddr_in6
listen()监听队列
1,存放未完三次握手的链接。
2,存放已经完成三次握手的链接
int listen(int sockfd, int backlog);
//listen()创建一个监听队列以存储待处理的客户连接,成功返回 0,失败返回-1
//sockfd 是被监听的 socket 套接字
//backlog 表示处于完全连接状态的 socket 的上限(完成三次握手的链接的个数)//linux 上是 5
accept()
accept()处理存放在 listen 创建的已完成三次握手的队列中的连接。每处理一个连接,则
accept()返回该连接对应的套接字描述符。
如果队列为空,则阻塞。
connect()
一般由客户端程序执行。指定服务器端的ip地址和端口。
进行三次握手,建立链接
send()/recv
:收发数据。向缓冲区写入和读取数据
close()
关闭TCP链接,进行四次挥手
在写程序之前ping 127.0.0.0
一下,看客户端与服务器端是否联通。
struct in_addr{u_int32_t s_addr;
//sin_addr: IPV4 地址结构:s_addr 以网络字节序表示 IPV4 地
};struct sockaddr_in{sa_family_t sin_family;
//sin_family: 地址族 AF_INETstruct in_addr sin_addr;//sin_port: 端口号,需要用网络字节序表示};
服务器端:
struct sockaddr_in saddr,caddr;
//专用套接子地址结构,设置主机ip地址和端口
memset(&saddr,0,sizeof(saddr));
//将初始值置为0
saddr.sin_family = AF_INET;
//设置地址组协议
saddr.sin_port = htons(6000);
//端口/ 小端存放转大端存放-----主机字节序列转网络字节序列
// 发送数据的时候,其字节会从(长整型,短整型主机字节转为网络字节),收数据相反。
saddr.sin_addr.s_addr = inet_addr("0.0.0.0");
//设置ip地址
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);//套接子协议(AF_INET 表示IPV4,AF_INET6 :IPV6)//TCP 数据传输为数据流 ,SOCK_STREAM//默认协议,一般为0if(sockfd == -1){exit(1);}struct sockaddr_in saddr,caddr; //专用套接子地址结构,设置主机ip地址和端口memset(&saddr,0,sizeof(saddr)); //将初始值置为0saddr.sin_family = AF_INET; //设置地址组协议saddr.sin_port = htons(6000); //端口/ saddr.sin_addr.s_addr = inet_addr("0.0.0.0");//设置ip地址int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//强转为通用套接子地址结构。if(res== -1){printf("bind falied");exit(1); }res = listen(sockfd,5); //监听套接子(已经完成三次握手和未完成三次握手)if(res == -1){close(sockfd);exit(1);}while(1){int len = sizeof(caddr); // caddr:那个客户端成功连接。那么caddr存放的就该ip地址和端口号。int c = accept(sockfd,(struct sockaddr*)&caddr,&len);//阻塞// 返回的该连接的连接套接子,处理已经完成三次握手的连接if(c == -1){continue;}printf("accept client ip :%s,port = %d\n",inet_ntoa(caddr.sin_addr),nthons(caddr.sin_port))//将ip地址幻化为点分十进制的整型。nthons网络转主机char buff[128] ={0};int n = recv(c,buff,127,0);printf("recv(%d):%s\n",n,buff);send(c,"ok",2,0);close(c);}
}
saddr
:存放的是服务器端的ip地址和端口
int len = sizeof(caddr);
// caddr
:那个客户端成功连接。那么caddr
存放的就该客户端主机的ip地址和端口号。
客户端
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>int main()
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){exit(1); }//客户端可以不用设置端口和ip地址,客户端去连接服务器,不需要知道自己的ip和端口,只需要知道服务器的就行。struct sockaddr_in saddr;memset(&saddr,0,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(6000);saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//连接服务器int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));if(res == -1){printf("connect failed\n");close(sockfd);exit(1); }printf("input:\n");char buff[128] = {0};fgets(buff,128,stdin);send(sockfd ,buff,strlen(buff)-1,0);memset(buff,0,128);recv(sockfd,buff,128,0);printf("recv:%s\n",buff);close(sockfd);exit(0);}
先启动服务器端
在启动客户端
最后发数据
【网络编程】TCP/IP (客户端--服务端)相关推荐
- java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计
[JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...
- WinSock API网络编程——TCP/IP协议详解
WinSock API网络编程--TCP/IP协议(http://www.impcas.ac.cn/usr/lujun/browse.asp?id=winsock_tcp) ...
- 网络编程-TCP/IP协议栈-TCP协议
TCP协议 TCP协议作用 TCP协议位于协议栈的传输层.当应用层向TCP层发送用于网间传输的,用8字节表示的数据流,TCP则吧数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受到改计算机连 ...
- QT入门第七天 网络编程TCP/IP/UDP+Http和JSON解析+qt事件软键盘【CSDN最详细】
网络编程+Http和JSON解析+qt事件软键盘 第一章 QT中的网络编程 [1]涉及到的类 [2]tcp协议的流程 [2.1]服务器的流程 socket-->bind-->listen- ...
- OSI七层模型以及TCP/UDP客户端/服务端程序实例
OSI七层模型以及TCP/UDP客户端/服务端程序实例 一.前言 二.OSI简介 2.1 OSI概念 2.2 划分原则 2.3 OSI七层模型 2.4 模型举例 三.Linux下TCP/UDP程序开发 ...
- 网络编程-TCP/IP协议栈-IP协议
协议 协议就是约定的一种规则,例如扑克游戏中约定好的各种规则,2<3<4<5<-等,以此作为游戏规则.当所有人都遵循这个规则,那么久可以不需要任何多余的交流就可以进行游戏,这个 ...
- JavaSE(十四)——网络编程(IP地址、端口号、TCP、UDP)
文章目录 1. 概述 2. InetAddress类 3. 端口 4. TCP协议 4.1 传输消息 4.2 文件上传 5. UDP协议 6. TCP与UDP区别 7. URL 8. 下载资源 9. ...
- Socket网络编程(2)--服务端实现
中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...
- C#中开发之Socket网络编程TCP/IP层次模型、端口及报文等探讨
我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念 1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基 ...
- python web开发 网络编程 TCP/IP UDP协议
文章目录 1. TCP/IP协议 1.1 IP协议 1.2 TCP协议 2. UDP协议 3. Socket 4. TCP编程 4.1 创建TCP服务器 4.2 创建TCP客户端 4.3 简易聊天工具 ...
最新文章
- 正则表达式练习 Regex Golf
- 开发线程安全的Spring Web应用
- 通过简单例子 | 快速理清 UML类图中六大关系
- 红杉中国合伙人刘星:新零售新在哪里?
- 从Activity返回结果
- RabbitMQ远程不能访问问题的解决
- Axure SVN共享 Commit Failed (details Follow) 问题解决
- 面试题:双重检验锁⽅式实现 单例模式
- Python3.8 安装gmpy2 教程, 无法安装gmpy2解决方案
- django-spaghetti-and-meatballs 0.2.0 : Python Package Index
- 学计算机用多大的u盘合适,u盘装系统需要多大的u盘|装系统需要多大的U盘
- Subscription expires on 2017/2/25. Usage of PhpStorm will no longer be possible.
- CANalyzer添加dbc文件
- A题:电流信号检测装置(本科)-- 2018年TI杯大学生电子设计竞赛
- 计算机如何识别英语,Excel自动识别中英文妙招三则 -电脑资料
- 摄像头 RTSP 以及远程管理
- 浅谈认识商业智能过程中遇到的困难
- Python-OpenCV——Image Blurring(Image Smoothing)
- Eclips 安装教程
- JVM(二十二) -- 性能监控与调优(三) -- JVM监控及诊断工具--GUI篇