【⽹络编程】基于TCPIP协议的CS模型
相关视频——
我的⼩站——
基于TCP/IP协议的C/S模型
基于TCP/IP协议的C/S模型
TCP/IP协议
全称——Transmission Control Protocol / Internet Protocol
重要性——TCP/IP协议是今天互联⽹的基⽯,没有这个就上不了⽹
概念——TCP/IP协议族(簇,组,体系),并不是TCP协议和IP协议的总称,指的是整个⽹络传输体系。⽽TCP协议和IP协议就是单单的两个协议。
特点——⾯向可连接的,可靠的,基于数据报的传输协议层。
UDP/IP协议——⾯向⾮连接的,不可靠的,基于数据报的传输层协议。
Client/Server客户端/服务器模型
C/S模型其实是概念层⾯的,实现层⾯可以是基于任何的⽹络协议。
常见的还有B/S模型——浏览器/服务器模型,基于http/https协议的
套接字编程与socket编程
socket中⽂——套接字
统称⽹络编程
使⽤
局域⽹
⼴域⽹——内⽹穿透,内⽹转发
服务端
⽹络头⽂件&⽹络库
是最底层的⽹络函数,QT、MFC、WPF等封装好的⽹络库都是对这些最本质的⽹络函数的⼆次封装。
不区分⼤⼩写(windows)
#include<WinSock2.h>
//第⼆版的⽹络库,是⼀版的升级优化版本
#pragma comment(lib,"ws2_32.lib")
//.lib静态库后缀,是库⽂件,将.cpp⽂件编译为⼆进制⽂件
//好处:使⽤时⽆需编译,直接使⽤,解决时间
//32位编译环境和64位编译环境都⽤这个,没有ws2_64
打开⽹络库
功能:
打开⽹络库/启动⽹络库,启动了这个库,库⾥的函数才能使⽤,功能才能实现。
int WSAStarp(
WORD wVersionRequired,
LPWSADATA lpWSAData
);
参数1
参数1-使⽤哪个版本的⽹络库-WORD-⽆符号short
WORD wdVersion =MAKEWORD(2,1);
//主版本号2存在低数据位,副版本号1存在⾼数据位
(参数前⾯有lp传地址)
参数2
参数2-创建⼀个结构体,传递给系统,系统将信息放到结构体中,函数调⽤之后在外⾯通过结构体查看系统传递给我们的信息。********************************************************************************
WSADATA wdSockMsg;
********************************************************************************
其中包括
struct WSAData {
WORD                    wVersion;//我们要使⽤的版本
WORD                    wHighVersion;//系统能提供给我们的最⾼的版本
unsigned short          iMaxSockets;//返回可⽤的socket数量,2版本之后就没⽤了
unsigned short          iMaxUdpDg;//UDP数据报信息的⼤⼩,2版本之后就没⽤了
char FAR *              lpVendorInfo;//供应上特定的信息,2版本呢之后就没⽤了
char                    szDescription[WSADESCRIPTION_LEN+1];//当前库的描述信息,2.0是第⼆版的意思
char                    szSystemStatus[WSASYS_STATUS_LEN+1];
char                    szDescription[WSADESCRIPTION_LEN+1];
char                    szSystemStatus[WSASYS_STATUS_LEN+1];
}
********************************************************************************
********************************************************************************
tcpip协议pdf
WSAStartup(wdVersion,&wdSockMsg);
********************************************************************************
当输⼊的版本不存在
例如:
1.3
2.3——有主版本,没有副版本得到主版本的的最⼤副版本1.12.2并使⽤
3.13.3——超过最⼤版本号,使⽤系统能提供的最⼤版本2.2
0.00.10.3——主版本是0,不⽀持请求的套接字版本
返回值
每⼀种错误有它唯⼀的对应码
if(nRes !=0)
{
printf("⽹络库打开失败");
return0;
}
返回值-成功返回0
-失败返回对应错误的宏
WSASYSNOTREADY  10091
底层⽹络⼦系统尚未准备好进⾏⽹络通信。
系统配置问题,重启下电脑,检查ws2_32库是否存在,或者是否在环境配置⽬录下
WSAVERNOTSUPPORTED 10092
此特定Windows套接字实现不提供所请求的Windows套接字⽀持版本。
要使⽤的版本不⽀持
WSAEPROCLIM    10067
已达到对Windows套接字实现⽀持的任务数量的限制。
Windows Sockets实现可能限制同时使⽤它的应⽤程序的数量
WSAEINPROGRESS  10036
正在阻⽌Windows Sockets 1.1操作。
当前函数运⾏期间,由于某些原因造成阻塞,会返回在这个错误码,其他操作均禁⽌
WSAEFAULT      10014
lpWSAData参数不是有效指针。
参数写错了
校验版本
HIBYTE(wdSockMsg.wVersion)!=2||LOBYTE(wdSockMsg.wVersion)!=2
HIBYTE是⾼位-副版本
LOBYTE是低位-主版本
例如:只要有⼀个不是2,说明系统不⽀持我们要的2.2版本
前⾯为主版本,后⾯为副版本
要打开2.1
HIBYTE(wdSockMsg.wVersion)!=1&&LOBYTE(wdSockMsg.wVersion)!=2
如果版本不对
WSACleanup();//清理⽹络库
return0;
创建socket
SOCKET socket(
int af,
int type,
int protocol
);
例如
SOCKET socketServer =socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
什么是socket
将底层复杂的协议体系,执⾏流程,进⾏封装,封装完的结果,就是⼀个socket了。
也就是说,socket是我们调⽤协议进⾏通信的操作接⼝。
意义
将复杂的协议过程与编程⼈员分开,我们只需要操作⼀个简单那的SOCKET就⾏了,对于底层的协议过程细节,我们完全不⽤知道,这就⼤⼤的⽅便了我们。
⽹络编程难在协议本⾝的复杂性,简单在我们编程层⾯完全不⽤考虑哪些。
本质
就是⼀种数据类型。就是⼀个整数。
socket的值是唯⼀的,通过这个值到对应的协议。
应⽤
⽹络通信的函数,全都要使⽤SOCKET,每个客户端有⼀个SOCKET,服务器有⼀个SOCKET,通信的时候,就需要这个SOCKET做参数,跟谁通信,就要传递谁的SOCKET。
SOCKET是⽹络封装的精华,写代码就是不停的使⽤SOCKET这个变量,所以⼜叫SOCKET编程。
参数1
地址的类型
加⼊你要与好友取得联系,可以通过电话、QQ、等⽅式
AF_INET 2
ipv4地址
Internet协议版本地址系列
例如:192.168.1.103
0.0.0.0~255.255.255.255
4字节,32位的地址
点分⼗进制表⽰法
AF_INET6 23
ipv6地址
Internet协议版本地址系列
例如:2001:0:3238:DFE1:63::FEFB
16字节,128位地址
AF_BTH 32蓝⽛地址例如:6B:2D:BC:A9:8C:12
AF_IRDA 26红外数据协会(lrDA)地址
参数2
套接字类型
SOCK_STREAM 1
提供给带有OOB数据传输机制的顺序,可靠,双向,基于连接的字节流。
使⽤TCP作为internet地址系列AF_INET or AF_INET6
SOCK_DGRAM 2
固定(通常很⼩)最⼤长度的⽆连接,不可靠的缓冲区。
使⽤UDP作为internet地址系列AF_INET or AF_INET6
SOCK_RAW 3
提供允许应⽤程序操作下⼀个上层协议头的原始套接字。
要操作IPv4标头,必须在套接字上设置IP_HDRINCL套接字选项。
要操作IPv6标头,必须在套接字上设置IPV6_HDRINCL套接字选项。
SOCK_RDM 4提供可靠的消息数据报。
这种类型的⼀个⽰例是Windows中的实⽤通⽤多播(PGM)多播协议实现,通常称为可靠多播节⽬。
仅在安装了可靠多播协议时才⽀持此类型值。
SOCK_SEQPACKET 5提供基于数据报的伪流数据包。
参数3
协议类型
这个位置写0是什么意思?
即系统给我们⾃动选择合适的协议。但不明确。
IPPROTO_TCP
传输控制协议(TCP)。当af参数为AF_INET或AF_INET6且类型参数为SOCK_STREAM时,这是⼀个可能的值。
可能的值是什么意思?
如果有个协议TOP前两个参数也传这样的参数,此时(socket)第三个参数即写成IPPROTO_TOP
IPPROTO_UDP
⽤户数据报协议(UDP)。当af参数为AF_INET或AF_INET6且类型参数为SOCK_DGRAM时,这是⼀个可能的值。
IPPROTO_ICMP
Internet控制消息协议(ICMP)。
当af参数为AF_UNSPEC,AF_INET或AF_INET6且类型参数为SOCK_RAW或未指定时,这是⼀个可能的值。
IPPROTO_IGMP
Internet组管理协议(IGMP)。
当af参数为AF_UNSPEC,AF_INET或AF_INET6且类型参数为SOCK_RAW或未指定时,这是⼀个可能的值。
IPPROTO_RM
⽤于可靠多播的PGM协议。
当af参数为AF_INET且类型参数为SOCK_RDM时,这是⼀个可能的值。
在针对Windows Vista及更⾼版本发布的Windows SDK上,此协议也称为IPPROTO_PGM。
仅在安装了可靠多播协议时才⽀持此协议值。
返回值
成功-返回可⽤的socket
失败-不⽤了⼀定要释放掉——closesocket(xxx);
然后再WSACleanup();清理⽹络库
注意⼆者的先后顺序,⼀定要先释放,然后再清理⽹路库,
因为closesocket()是⽹络库中的函数。
********************************************************************************
失败——返回INVALID_SOCKET
if(INVALID_SOCKET == socketServer)
{
int a =WSAGetLastError();//获取错误码
WSACleanup();
return0;
}
//获取错误码——int a = WSAGetLastError();
//检测在它上⾯离它最近的错误码
绑定地址与端⼝
int bind( SOCKET s,const sockaddr* addr,int namelen);
作⽤
给我们的socket绑定端⼝号和具体地址
地址:到电脑,理论上只有⼀个。
端⼝号:到电脑上对应软件的具体功能,每个通信的端⼝号是唯⼀的,同⼀个软件可能占⽤多个端⼝号。
参数1
传递上⾯创建好的socket

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。