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。

  • 相关阅读:
    log4j的使用
    关于spring读取配置文件的两种方式
    BeanUtils组件的使用
    javaee 自定义标签实战
    javaweb中的标签的核心标签库的常用标签
    对接口的思考
    二分查找
    java抽象类
    多例集合
    js中for循环的研究
  • 原文地址:https://www.cnblogs.com/DOGame/p/10555850.html
Copyright © 2011-2022 走看看