TCP与UDP各自特点
TCP与UDP是网络层常用通信协议两者主要有以下特点:
TCP:
1. TCP是一种面向连接的、可靠的传输层协议;
2.进行拥塞控制,当前网络发生通信拥塞时,发送者降低发送的速率,以便接收方能够有效的对数据包进行接收,尽可能的避免了发生丢包现象。
3.具有数据流的特性,数据没有边界
4. 要提供可靠交付,具有差错控制功能,需要遵守三次握手协议,需要建立维持连接后,才能进行与通信方进行三次握手。
recv函数主要的应用有:HTTP超文本传输协议、FTP文件传输协议、Telnet远程连接协议、SMTP邮件传输协议
UDP:
1.UDP是面向无连接服务,不可靠的传输协议
2.传输数据之前源端和终端不建立连接,直接将要传送的数据包发送到网络上即可,简单方便,效率高。
3.没有流量控制,极有可能会在网络通信情况不好的时候发生丢包现象。
4.没有差错控制,不能确定数据包在传输过程中信息是否发生了改变,可靠性不高
主要应用:流媒体、视频会议、DNS数据包发送、Internet电话
详细说明简单UDP和TCP网络编程流程
TCP流程图解:
对于TCP的网络编程,我认为主要分为如图所示:
对于tcp接连方式服务器来说的6个流程步骤:
1.程序初始化:启动SOCKET库,创建socket套接字,包括网络头文件的添加,网络编程初始化函数的调用。
2.填写本机地址信息:填写SOCKADDR_IN中能数据,设定对自身通信地址与端口号,调用bind()函数进行端口绑定。
3.监听绑定的固定的端口,调用listen()函数进行端口监听。
4.当通过accept()函数收到Client的连接请求后建立一个socket连接,或没有收到则继续监听,构成一个循环监听模块。
5.产生一个新的进程与Client进行通信和信息处理,通过receive()函数接收客户端发过来的信息并通过send()函数反馈处理后的信息。
6.子通信结束后中断与Client的连接,运用close()关闭套接字。
对于tcp连接方式的客户端程序来说可以分为4个流程步骤:
1. 启动SOCKET库,创建socket套接字,包括网络头文件的添加,网络编程初始化函数的调
用。
2.先填写服务器地址信息并通过connect()函数发出与目标服务器的连接请求。
3.通过receive()与send()函数与服务器通信和信息处理。
4.调用close()函数在通信结束后断开连接。
UDP流程图解:
服务器的主要流程可以分为四个步骤:
1.程序初始化:启动SOCKET库,创建socket套接字,包括网络头文件的添加,网络编程初始化函数的调用。
2.填写本机地址信息:填写SOCKADDR_IN中能数据,设定对自身通信地址与端口号,调用bind()函数进行端口绑定。
3.当接收到客户端消息后产生一个新的进程与Client进行通信和信息处理,通过receivefrom()函数接收客户端发过来的信息并通过sendto()函数反馈处理后的信息。
4.子通信结束后中断与Client的连接,运用close()关闭套接字。
客户端主要流程可以分为三个步骤
1. 启动SOCKET库,创建socket套接字,包括网络头文件的添加,网络编程初始化函数的调用。
2.通过receivefrom()与sendto()函数与服务器通信和信息处理。
4.调用close()函数在通信结束后断开连接。
总结:UDP服务器相对于TCP服务器来说大同小异,最主要的区别中UDP服务器不需要监听端口,客户端程序也无需像TCP一样需要经过三次握手协议建立连接。
Windows环境下与Linux环境下网络编程的区别
一、linux下的socket编程:
1、客户端执行步骤依次如下:
需要调用以下函数:
socket()
connect()
send()或者recv()
close()
注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().
需要调用以下函数:
2、服务器端:
socket()
bind()
listen()
accpet()
recv()或者send()
close()
(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)
二、windows下的网络编程:
做过windows网络编程的人都知道,微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。即windows既提供上层的网络API函数也提供底层的API函数。
1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:
客户端:
需要调用以下对象中的函数:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
服务器端:
需要调用以下对象中的函数:
先调用AfxSocketInit()检测协议栈安装情况
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()
2、对于采用底层的API函数而言,也是是先加加入<winsock2.h>这个头文件后步骤如下:
客户端:
需要直接调用以下的函数:
WSAStartup()
socket()
connect()
send()或者recv()
closesocket()
服务器端:
需要直接调用以下的函数:
WSAStartup()
socket()
bind()
socket()
bind()
listen()
accpet()
send()
recv()
closesocket()
accpet()
send()
recv()
closesocket()
(ps:windows下CSocket类为同步方式,有阻塞现象;CASyncSocket为异步方式,无阻塞现象。)
通过以上比较可以发现:linux下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论