浅谈TCP socket

Socket,用来实现应用的通信,是应用非常广的一个api,今天就来揭开它的神秘面纱。

客户端

  1. 引入头文件

    #include <winsock2.h>
  2. 初始化socket的DLL
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData
  3. 创建套接字
        SOCKET socket(int domain, int type, int protocol);
  • domain 是协议域,包括

    • AF_INET 对应 ipv4
    • AF_INET6 对应 ipv6
  • type 是连接类型
    • SOCK_STREAM,提供面向连接的稳定数据传输,即TCP协议。
    • SOCK_DGRAM,提供的是数据报(datagram),使用UDP协议。
    • protocol,一般设为0,内核会自动匹配。
  1. 存储服务器信息

    客户端要去连接服务器,所以应该存储服务器的IP地址和端口号。

    这边已经在 netinet/in.h 帮我们实现了一个结构体 struct sockaddr_in 来存储服务器信息。作为函数参数时强制转换为sockaddr。

    struct sockaddr_in {
        short   sin_family;   // 必须为AF_INET,因为是IPv4;
        unsigned short   sin_port;    // 存储port No
        struct in_addr   sin_addr;    //存储IP地址
        char             sin_zero[8];
    };

    网络的字节顺序为大端法,我们要想正确通信,就必须统一格式。

    那么什么是大小端呢?

    大端是高位字节存在低地址中,小端是低位字节存在低地址中。

    因此如果本地端口格式是小端要转为大端。

    htons(PORT)就是将本机的字节序转化为网络的字节序。

  2. 连接服务器
    int connect(SOCKET sockfd, const struct sockaddr *serv_addr,socklen_t addrlen)
  • SOCKET sockfd,本地的socket
  • const struct sockaddr *serv_addr, 将SOCKADDR_IN的对象转为 sockaddr 指针
  • socklen_t address_len 就是sockaddr的大小
  1. 收发消息

    ssize_t send(SOCKET sockfd, const void *buf, size_t len, int flags)
    
    ssize_t recv(SOCKET sockfd, void *buf, size_t len, int flags)
    
    • SOCKET sockfd,本地的socket描述字
    • const void *buf,字符串指针,数据缓冲区
    • size_t len,接受的长度
    • int flags,通常从设为0
  2. 断开
    int PASCAL FAR closesocket(SOCKET s);

    关闭套接字

服务器

  1. 创建服务器套接字
  2. 存储服务器信息
  3. bind绑定

    将服务器套接字与服务器信息绑定在一起

    int bind(SOCKET socket, const struct sockaddr* address, socklen_t address_len);
    • SOCKET socket,服务器本地的socket
    • const struct sockaddr *address, 将SOCKADDR_IN的对象转为 sockaddr 指针
    • socklen_t address_len 就是sockaddr的大小
  4. 监听
    int listen(SOCKET sockfd, int backlog)

    listen()函数可以让套接字进入被动监听状态

    sockfd为需要进入监听状态的套接字,backlog 为请求队列的最大长度。

    所谓被动监听,是指当没有客户端请求时,套接字就会处于睡眠状态,只有当接收到客户端请求时,套接字才会被唤醒来响应请求。

  5. accept

    用accept来接受客户端的请求,这时候会产生一个新的套接字,记重点,新的,之后的通信全部用这个新的套接字,原来的套接字还在监听客户端的请求。

    int accept(SOCKET sockfd, struct sockaddr *addr, socklen_t *addrlen)
    • SOCKET sockfd,服务器本地的socket
    • struct sockaddr *addr,用于存储客户端的IP和端口号等
    • socklen_t address_len,描述addr的大小

    注意这边的accept是会阻塞的,那么什么是阻塞,就是如果没有接收到,那么我就会一直等在这边,比如我们刚学c语言的scanf函数的时候,它就会阻塞到那里等待用户输入。

    包括send和recv也是会阻塞的。

  6. 新套接字用来收发信息
  7. 关闭套接字

参考资料:

1.简单的聊天室实现(上):通信-SOCKET

2. TCP Socket Programming 學習筆記

3. 使用listen()和accept()函数

时间: 2024-10-07 18:06:19

浅谈TCP socket的相关文章

浅谈tcp socket的backlog参数

最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下. 底层 backlog参数主要用于底层方法int listen(int sockfd, int backlog), 在解释backlog参数之前,我们先了解下tcp在内核的请求过程,其实就是tcp的三次握手: 1.client发送SYN到server,将状态修改为SYN_SEND,如果server收到请

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

浅谈android Socket 通信及自建ServerSocket服务端常见问题

摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通信提供了良好的封装,使用Socket对象代表两端的通信接口,通过Socket产生I/O流进行网络通信. 自建ServerSocket服务端时可能因PC与手机平板终端未接入同一路由器,因此无法访问服本地IP,可以尝试以下两种方式解决 关键词: Socket; ServerSocket;本地IP; ad

Linux网络编程——浅谈 TCP 三次握手和四次挥手

一.tcp协议格式 二.三次握手 在 TCP/IP 协议中.TCP 协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送 syn 包(tcp协议中syn位置1.序号为J)到server,并进入 SYN_SEND 状态.等待server确认: 第二次握手:server收到 syn 包,必须确认客户的 SYN,同一时候自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1.序号K,确定序号为J+1),此时server进入 SY

浅谈 TCP 三次握手

三次握手(three times handshake:three-way handshake)所谓的"三次握手"即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送.接收完毕后何时撤消联系,并建立虚连接. 在 TCP/IP 协议中,TCP 协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认: 第二次握手:服务器

浅谈TCP的窗口字段

该掸掸这里的灰尘了,写一篇关于TCP的文章吧.今天的主题是TCP的滑动窗口.在开始这个话题之前,我想先提几个关于TCP协议的常见误区. 误区1:TCP协议三次握手过程中后两个包都是[ACK]包. 解释:这种说法并不错,只是不严谨.首先,第一个包是[SYN],SYN位在TCP报头flag字段中,见上图TCP报头结构.第二个包更确切地说应该叫[SYN,ACK]包,因为除了ACK位被置位以外,SYN位也被置位了.第三个包才是单纯的ACK包,因为只有ACK位被置位.所以三次握手的过程为: 客户端----

浅谈Flash Socket通信安全沙箱

用过Flash socket的同学都知道.Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时.会向服务端获取安全策略,假设得不到服务端响应,flash将无法连接到服务端. 首先.什么是Flash安全沙箱? Flash安全沙箱是Flash Socket的一种安全策略.为避免随意Flash终端与目标主机建立Socket通讯,以授权port,域名方式限定连接. 那么.Flash Player怎么获取Socket策略? Flash Player发起socke

[转]浅谈Flash Socket通信安全沙箱

用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无法连接到服务端. 首先,什么是Flash安全沙箱? Flash安全沙箱是Flash Socket的一种安全策略,为避免任意Flash终端与目标主机建立Socket通讯,以授权端口,域名方式限定连接. 那么,Flash Player怎么获取Socket策略? Flash Player发起socket通

浅谈TCP/IP协议

一.简介 TCP/IP协议是供已连接因特网的计算机进行通信的通信协议.TCP/IP协议,并不是指单TCP.IP协议两个.而是一个协议栈.包含了诸如:TCP.IP.UDP.ICMP.RIP.TELNETFTP.SMTP.ARP.TFTP等许多协议. 二.参考模型 TCP/IP参考模型 应用层 传输层 网络层 链路层 三.工作机制 TCP/IP 意味着 TCP 和 IP 在一起协同工作. TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信. IP 负责计算机之间的通信. TCP 负责将数据分