UDP Socket编程
UDP:在客户端和服务器之间没有连接
- 没有握手【建立起socket之后,UDP Socket只是和本地的IP和端口相捆绑,不跟对方的IP和端口相捆绑】
- 发送端在每一个报文中明确地址指定目标的IP地址和端口号【不然就不知道发给谁,因为没有握手】【发的时候要指明发送端的端节点,还要指明发送的东西,另外一方面还要指明发送给谁】
- 服务器必须从收到的分组中提取出发送端的IP地址和端口号【任何一个守候在UDP端口之上的UDP进程,在收报文的时候要收对方发过来的是什么、对方的端节点,知道谁发给我的,转化完了之后我才知道要发给谁】【收的时候除了指明我从哪个socket去收,收的是什么,还要获取一个引用型的参数,知道谁发给我的】
UDP:传送的数据可能乱序,也可能丢失
进程视角看UDP服务——UDP为客户端和服务器提供不可靠的字节组的传送服务
【UDP是无连接的,所以提供的服务也叫数据报,IP也叫数据报(datagram),无连接的PDU通常可以把它叫数据报,所以看到datagram要结合上下文来看他是UDP的协议数据单元还是IP的协议数据单元】
Client/server socket 交互:UDP
【第一步(服务器端)建立一个serverSocket,返回一个整数】
【第二步(服务器端)bind,把返回的serverSocket的值和本地的sad(IP地址和端口号)相捆绑】
【第三步(服务器端)recvfrom,read from serverSocket,仍然是serverSocket,等待客户端向我发送什么东西。从serverSocket去读,读的东西放到Sen,谁发给我的(对方的IP地址和端口)作为一个引用型参数,相当于是一个返回值返回给服务端。如果对方发送东西,这个函数就会解除阻塞,如果没有就一直阻塞着】
【第四步,客户端clientSocket,在参数中指明是UDP socket】
【第五步,(客户端)有一个本地的bind(隐式的),把clientSocket和本地的端口值相捆绑】
【第六步,(客户端)sendto,在sendto当中指明要使用的端口、clientSocket值,要发的是什么】
【sendto发出去之后recvfrom解除阻塞,然后recvfrom返回一个有效值,在Sen放传过来的是什么,之后对他进行一个大小写转换】
【第七步,(服务端)sendto,serverSocket作为参数,谁发送给我的我发送给谁(&
cad)】
【第八步,(客户端)read,借助于clientSocket,就会得到来自服务器端已经转换完之后的大写字符串,再把它显示出来,再关掉,然后客户端再关闭socket】
【在UDP之上不需要握手,建立去socket值之后就发了,在服务器上没有welcomeSocket和connectionSocket之分,只有一个socket,代表的是本地的IP和相应的端口】
样例:C客户端(UDP)
样例:C服务器(UDP)
参考资料:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 P21