前言

10013

以一种访问权限不允许的方式做了一个访问套接字的尝试。 


原因

绑定一个处于CLOSE_WAIT状态的端口,会产生该错误


重现

先找到一个处于CLOSE_WAIT状态的端口49724

C:\Users\admin>netstat -ano |findstr CLOSE_WAIT
  TCP    192.168.11.149:49724   123.60.175.170:80      CLOSE_WAIT      5904

代码测试

#include <iostream>

#include <winsock2.h>  
#include <stdio.h>  
#pragma comment(lib,"ws2_32.lib")  

int main()
{
	//初始化WSA
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;//WSADATA结构体变量的地址值

	//int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
	//成功时会返回0,失败时返回非零的错误代码值
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		std::cout << "初始化网络库失败,错误码:" << WSAGetLastError() << std::endl;
		return -1;
	}

	//创建套接字
	SOCKET socketListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (socketListen == INVALID_SOCKET)
	{
		std::cout << "创建套接字失败,错误码:" << WSAGetLastError() << std::endl;
		return -1;
	}

	//绑定IP和端口
	sockaddr_in sin;//ipv4的指定方法是使用struct sockaddr_in类型的变量
	sin.sin_family = AF_INET;
	sin.sin_port = htons(49725);//设置端口。htons将主机的unsigned short int转换为网络字节顺序
	sin.sin_addr.S_un.S_addr = inet_addr("192.168.11.149");//IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址
	//bind函数把一个地址族中的特定地址赋给scket。
	if (::bind(socketListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		std::cout << "绑定套接字失败,错误码:" << WSAGetLastError() << std::endl;
	}
	else
	{
		std::cout << "绑定套接字成功" << std::endl;
	}
	return 0;
}

排查过程

netstat -ano > d:/netstat.txt

tasklist >d:/tasklist.txt

监控所有的端口