验证:多次调用WSAStartup会发生什么?

本文通过实验探讨了在Windows环境下多次调用WSAStartup函数的现象及后果,揭示了在网络编程中,即使已初始化Winsock的情况下再次调用该函数仍能成功,且不会引发错误。文章展示了具体的代码实现与执行结果,对于理解Winsock库的行为提供了实践依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,总想验证一些奇怪的想法,干脆就写下来,以备后查。

想法:多次调用WSAStartup会发生什么?

void TestCase_WSAStartupAndCleanup()
{
	WORD versionRequested1_1, versionRequested2_2;
	WSADATA wsaData1_1, wsaData2_2;
	int err;

	versionRequested1_1 = MAKEWORD(1, 1);
	versionRequested2_2 = MAKEWORD(2, 2);

	err = WSAStartup(versionRequested1_1, &wsaData1_1 );
	if ( err != 0 ) {
		printf_s("wsa startup failed. [%u] \n", WSAGetLastError());
		return;
	}
	printf_s("wsa startup success. [%u.%u] \n", LOBYTE(wsaData1_1.wVersion), HIBYTE(wsaData1_1.wVersion));

	// 模拟中间其他函数又初始化网络的情况
	{
		err = WSAStartup(versionRequested2_2, &wsaData2_2 );
		if ( err != 0 ) {
			printf_s("wsa startup failed. [%u] \n", WSAGetLastError());
			return;
		}
		printf_s("wsa startup success. [%u.%u] \n", LOBYTE(wsaData2_2.wVersion), HIBYTE(wsaData2_2.wVersion));

		// do something ...

		if ( LOBYTE( wsaData2_2.wVersion ) != 2 || HIBYTE( wsaData2_2.wVersion ) != 2 ) {
			WSACleanup();
			return; 
		}
	}

	if ( LOBYTE( wsaData1_1.wVersion ) != 1 || HIBYTE( wsaData1_1.wVersion ) != 1 ) {
			WSACleanup();
			return;
	}
}

 

执行结果:

Visual Leak Detector Version 2.5.1 installed.
wsa startup success. [1.1]
wsa startup success. [2.2]
No memory leaks detected.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值