孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程”

本文详细介绍了TCP和UDP套接字编程,包括TCP的三次握手和面向连接的特性,以及UDP的无连接和不可靠传输。在TCP中,服务器端的顺序包括加载库、创建套接字、绑定地址、监听、接受连接、通信和关闭套接字,客户端则是加载库、创建套接字、发起连接、通信和关闭套接字。UDP编程中,服务器等待接收数据,客户端发送数据。文章还提供了基于TCP和UDP的服务器端和客户端程序示例。
  OSI 的各层所使用的协议:

1.应用层:telnet,FTP,HTTP,DNS,SMTP,POP3

2.传输层:TCP,UDP
      TCP:
面向连接的可靠的传输协议,通信前建立三次握手,握手成功后才能通信,对数据准确性要求较高的场合使用,如从网上载的安装文件,不能缺少任何信息

      UDP:是无连接的,不可靠的传输协议,不需要建立连接,也没有重传和确认的机制,在实时性要求较高,但对数据准确度要求不是很高的场合使用,如视频会议,在线观看电影,当中丢失个别数据包并不影响整体的效果。

3.网络层:IP

 

因为OSI七层结构较为复杂,所以使用较多的是TCP/IP模型,现在TCP/IP已经成为Internet上通用的工业标准

TCP/IP模型包括4个层次:应用层,传输层,网络层,网络接口

 

端口:

1.      为了标识通信实体中进行通信的进程(应用程序),TCP/IP协议提出了协议端口的概念

2.      端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用和某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出

3.      端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCPUDP是完全独立的的两个软件模块,因此各自的端口号也相互独立

4.      端口使用一个16位的数字来表示,它的范围是0~655351024以下的端口号保留给预定义的服务,例如,http使用80端口

 

套接字(Socket

1.      Socket的出现,使得程序员可以很方便的访问TCP/IP,从而开发各种网络应用的程序

2.      套接字存在于通信区域中,通信区域也叫地址族,他是一个抽象的概念,主要用于通过套接字通信的进程的共有特性综合在一起。套接字通常只与同一个区域的套接字交换数据。

 

套接字的类型

1.      流式套接字(SOCK_STREAM

提供面向连接的,可靠的数据传输服务,数据无差错,无重复的发送,且按发送的顺序接收,基于TCP协议

2.      数据保式套接字(SOCK_DGRAM)

提供无连接的服务,数据包以独立包形式发送,不提供无错误的保证,数据可能丢失或重复,且接收顺序混乱,基于UDP协议

 

基于TCP(面向连接)的Socket编程

服务器端顺序:

1.      加载套接字库

2.      创建套接字(socket

3.      将套接字绑定到一个本地地址和端口上(bind

4.      将套接字设为监听模式,准备接收客户请求(listen

5.      等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept

6.      用返回的套接字和客户端进行通信(send/recv

7.      返回,等待另一个客户请求

8.      关闭套接字(closesocket)

 

客户端程序:

1.      加载套接字库

2.      创建套接字(socket)

3.      向服务器发送连接请求(connect

4.      和服务器端进行通信(send/receive)

5.      关闭套接字(closesocket)

 

基于UDP(面向无连接)的socket编程

服务器端(接收端)程序:

1.      加载套接字库

2.      创建套接字(socket

3.      将套接字绑定到一个本地地址和端口上(bind

4.      等待接收数据(recvfrom

5.      关闭套接字(closesocket)

 

客户端(发送端)程序

1.      加载套接字库

2.      创建套接字(socket

3.      向服务器发送数据(sendto

4.      关闭套接字(closesocket)

 

创建基于TCP协议的CS程序的Server端所涉及的相关函数说明(按使用的先后顺序排列):

1.     int WSAStartupWORD wVersionRequested,LPWSADATA lpWSAData:作用是加载套接字库和进行套接字库的版本协商
a.
参数wVersionRequested:用于指定准备加载的Winsock库的版本,高位字节指定所需要的Winsock库的副版本,低位字节则是主版本,可用MAKEWORD(X,Y)(其中,x为高位字节,y为低位字节)方便获得wVersionRequested的正确值。
b.
参数lpWSAData:指向WSADATA结构的指针,WSAStartup用其加载的库版本有关的信息填在这个结构中

2.     SOCKET socket(int af,int type,int protocol):

a.      参数af指定地址族,对于TCP/IP协议的套接字,它只能是AF_INET(也可写成PF_INET)

b.      参数type指定Socket类型,对于1.1版本的Socket,它只支持两种类型的套接字,SOCK_STREAM指定产生流式套接字,SOCK_DGRAM产生数据报套接字。

c.      参数protocol与特定的地址家族相关的协议,如果指定为0,那么他就会根据地址格式和套接字类别,自动为你选择一个合适的协议。这是推荐使用的一种选择协议的方式。

3.     int bind(SOCKET s,const struct sockaddr FAR *name,int namelen) :

a.      第一个参数指定要绑定的套接字,第二个参数指定该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于该地址结构是为了所有的地址家族准备使用的,这个结构可能(通常会)随使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构的长度。sockaddr机构定义如下:
struct sockaddr

{

      u_short sa_family;

      char sa_data[14];

}

b.      上述结构第一个字段指定该地址家族,在这里必须设为AF_INETsa_data仅仅是表示要求一块内存分配区,起到占位的作用,该区域中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替换sockaddr。在TCP/IP中,我们可以用SOCKADDR_IN结构来代替sockaddr,以方便我们填写地址信息。

c.      struct SOCKADDR_IN{

    short  sin_family;

    unsigned short  sin_port;

    struct  in_addr  sin_addr;

    char  sin_zero[8];

};

sin_family表示地址族,对于IP地址,sin_family成员将一直是AF_INET;成员sin_port指定的将要分配给套接字的端口;成员sin_addr给出的是套接字的主机IP地址;sin_zero只是一个填充数,以使sockaddr_in结构和sockaddr结构的长度一样,一般不用设置。

除了sin_family外,SOCKADDR_IN其他成员是按网络字节顺序表示的。所以需要进行转换:htonl(INADDR_ANY)

评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值