TCP Socket 编程基础

时间:2022-05-13 00:39:59

一:端口

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\n", 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。