zoukankan      html  css  js  c++  java
  • TCP Socket 编程基础

    一:端口

    1:网络传送数据的时,按照端口来进行数据包分类; 1):端口的取值范围在[1, 65535]; 2):[1, 1023]系统保留端口; 3):[1024,5000] BSD临时端口; 用户使用 4):[5001-65535], BSD服务器(非特权)端口; 用户使用

    2:哪个数据包属于哪个端口的,根据端口分类; 1):所以应用程序通过网络收发数据的时候,一定会对应一个端口; 3:查看端口占用: 1) netstat -ano 观察被占用的端口 2)ESTABLISHED状态: 表示建立了连接正在通讯; 3)CLOSE_WAIT状态: 对方已经关闭,你也要关闭你的socket; 4)TIME_WAIT: 我方主动调用close()断开连接,收到对方确认后状态变为TIME_WAIT

    二:Win socket

    1: windows socket 编译库文件与头文件: #include<winsock2.h> #include <windows.h> #pragma comment(lib, "WSOCK32.LIB")

    2: windows 开始运行的时候指定socket 的版本: WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(2, 2) WSAStartup(wVersionRequested, &wsaData);

    3:结束后清理下: WSACleanup(); 4: linux下面不需要做这样的事情,大部分的socket接口,linux与windows兼容, windows会有自己的 相关扩展。

    三:服务器监听socket

    1: 创建一个socket,指明是TCP 的socket; int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    2: bind ip地址与端口

    struct sockaddr_in sockaddr; s

    ockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    sockaddr.sin_family = AF_INET;

    sockaddr.sin_port = htons(port);

    int ret = bind(s, (const struct sockaddr*)&sockaddr, sizeof(sockaddr));

    3:监听端口: ret = listen(s, 1); // 将socket作为监听端口;

    4: 接入一个客户端:

    struct sockaddr_in c_address;

    int address_len = sizeof(c_address);

    client_fd = accept(s, (struct sockaddr*)&c_address, &address_len);

    printf("new client comming...! %s:%d ", inet_ntoa(c_address.sin_addr), ntohs(c_address.sin_port));

    5: recv/send 数据 6: closesocket: 关闭socket,断开连接;

    四:客户端连接服务器

    1: 创建一个TCP socket: int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    2: 配置连接ip地址:

    struct sockaddr_in sockaddr;

    sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

    sockaddr.sin_family = AF_INET;

    sockaddr.sin_port = htons(6000);

    3: 连接到特定的服务器:

    int ret = connect(s, ((struct sockaddr*) &sockaddr), sizeof(sockaddr));

    4: recv/send 收发数据;

    6: closesocket: 关闭socket;

    7:客户端自己也会分配一个没有被占用的端口和服务器连接,不一定是服务器的端口;

    五:关闭socket

    1: 根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.

    2:收到关闭消息的时候,马上关闭掉对应的socket。

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/DOGame/p/10555850.html
Copyright © 2011-2022 走看看