windows10 sockect tcp

1. 在vs下添加ws2_32.lib库

右键【项目】-【属性】-【链接器】-【输入】-【附加依赖项】,进行编辑,添加 ws2_32.lib库,去掉从父级或项目默认设置继承的勾选,如下图所示:

这是因为inet_addr是一个老函数,而微软就是喜欢强迫别人用它的新函数。

【解决方案】

  1. 用socket的新函数代替程序出现的所有老函数,此方法学习成本太高。

  2. 在项目属性里设置,告诉编译器,我就用老函数,让她不要报错了。

所以推荐使用第二种解决方案,设置方法如下:

右键【项目】-【属性】-【配置属性】-【C/C++】-【常规】-【SDL检查】的值改为"否",如下图:

cpp 复制代码
Tcp服务端
#include<winsock2.h>
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"WS2_32.lib")
int main()
{
	WSADATA data;
	WORD w = MAKEWORD(2, 0);
	char sztext[] = "欢迎你\r\n";
	::WSAStartup(w, &data);
	SOCKET s, s1;
	s = ::socket(AF_INET, SOCK_STREAM, 0);
	sockaddr_in addr, addr2;
	int n = sizeof(addr2);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(75);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;//通过将 `INADDR_ANY` 赋值给 `sin_addr.S_un.S_addr` 字段,
	//可以使套接字监听所有本地可用的IP地址。
	//这样一来,无论是IPv4还是IPv6地址,
	//都可以被套接字监听和处理连接请求
	::bind(s, (sockaddr*)&addr, sizeof(addr));
	::listen(s, 2);
	printf("服务器已经启动\r\n");
	while (true)
	{
		s1 = ::accept(s, (sockaddr*)&addr2, &n);//这行代码表示接受一个传入连接请求,
		//并将客户端的地址信息保存到 `addr2` 中,
		//并且使用 `n` 来获取 `addr2` 结构体大小。
		if (s1 != NULL)
		{
			printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr));
			::send(s1, sztext, sizeof(sztext), 0);
		}
		::closesocket(s);
		::closesocket(s1);
		::WSACleanup();
		if (getchar())						//如果有输入则关闭程序
		{
			return 0;						//正常结束程序
		}
		else
		{
			::Sleep(100);
		}

	}
	return 0;
}
cpp 复制代码
Tcp客户端
#include<winsock2.h>						//包含头文件
#include<stdio.h>
#include<windows.h>
#pragma comment(lib,"WS2_32.lib")			//显式连接套接字库
int main()								//主函数开始
{
	WSADATA data;						//定义WSADATA结构体对象
	WORD w = MAKEWORD(2, 0);				//定义版本号码
	::WSAStartup(w, &data);					//初始化套接字库
	SOCKET s;							//定义连接套接字和数据收发套接字句柄
	char sztext[10] = { 0 };
	s = ::socket(AF_INET, SOCK_STREAM, 0);		//创建TCP套接字
	sockaddr_in addr;					//定义套接字地址结构
	addr.sin_family = AF_INET;				//初始化地址结构
	addr.sin_port = htons(75);               //设置端口号75
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//设置目标网络地址
	printf("客户端已经启动\r\n");					//输出提示信息
	::connect(s, (sockaddr*)&addr, sizeof(addr));
	::recv(s, sztext, sizeof(sztext), 0);
	printf("%s\r\n", sztext);
	::closesocket(s);					//关闭套接字句柄
	::WSACleanup();					//释放套接字库
	if (getchar())
	{
		return 0;						//正常结束程序
	}
	else
	{
		::Sleep(100);
	}
}
相关推荐
虎头金猫18 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
wuyk55520 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52121 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata1 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK1 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19921 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖1 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20231 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5551 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
z落落1 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp