zoukankan      html  css  js  c++  java
  • 基于TCP/UDP的socket编程

    基于TCP(面向连接)的socket编程
    服务器端顺序: 
    1. 创建套接字(socket) 
    2. 将套接字绑定到一个本地地址和端口上(bind) 
    3. 将套接字设为监听模式,准备接收客户请求(listen) 
    4. 等待客户请求的到来;当请求带来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept) 
    5. 用返回的套接字和客户端进行通信(send/recv) 
    6. 返回,等待另一个客户请求 
    7. 关闭套接字(closesocket)
    客户端程序: 
    1. 创建套接字(socket) 
    2. 向服务器发送连接请求(connect) 
    3. 和服务器端进行通信(send/recv) 
    4. 关闭套接字(closesocket)

    TCP建立连接的三次握手发生在socket的那几个函数中呢?请看下图:

    图1、socket中发送的TCP三次握手

    从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

    总结:客户端的connect在三次握手的第二个次返回,而服务器端的accept在三次握手的第三次返回。

    基于UDP(面向无连接)的socket编程 
    服务器端(接收端)程序: 
    1. 创建套接字(socket) 
    2. 将套接字绑定到一个本地地址和端口上(bind) 
    3. 等待接收数据(recvfrom) 
    4. 关闭套接字(closesocket) 
    客户端(发送端)程序 
    1. 创建套接字(socket) 
    2. 向服务器发送数据(sendto) 
    3. 关闭套接字(closesocket)

    如何用UDP协议实现TCP协议?

    一点思路:使用UDP协议在数据包里添加TCP的头部使其能够实现TCP的基本功能,包括重传,滑动窗口,慢开始和拥塞控制,滑动窗口的大小可以通过命令行指定。即应用层再封装一个TCP报头,然后解析的时候在协议栈里面把偏移多偏几个字节。

    参考资料:

    [1] Linux Socket编程(不限Linux).
    http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

    [2] 如何基于udp实现tcp协议栈?
    http://bbs.csdn.net/topics/280046868

  • 相关阅读:
    6.基础控件
    5.对话框组合
    4.对话框程序
    3. MFC原理介绍
    三星曲面显示器
    笔记本光驱接口怎么外接台式机硬盘?
    笔记本usb外接3.5寸sata台式机硬盘, 用mhdd检测不到,怎么处理?
    MHDD检测不到硬盘的解决办法
    MHDD检测电脑硬盘坏道
    一个指向指针函数的函数指针
  • 原文地址:https://www.cnblogs.com/mrsandstorm/p/5701683.html
Copyright © 2011-2022 走看看