c++ Socket学习——The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:

本文详细解析了在C++服务器编程中使用Socket时遇到的错误,包括从SOCKET转换到int的数据丢失警告及read函数的废弃问题。通过调整预处理器定义,成功解决了编译错误,确保了服务器能正确接收客户端消息。

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

在写c++服务器时发现问题如下:
源码:

// ConsoleApplicationSock.cpp: 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <winsock.h>
#include <string.h>
#include <corecrt_io.h>
#pragma comment(lib,"ws2_32.lib")

int serverport = 5188;
//创建,绑定套接字,并开启监听
SOCKET InitialSocket()
{
	//创建套接字
	SOCKET listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (listenfd == INVALID_SOCKET)
	{
		printf("socket error!");
	}

	//绑定套接字,成功返回0,失败返回-1
	struct sockaddr_in servaddr;
	memset(&servaddr, 0, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_port = htons(serverport);
	servaddr.sin_addr.S_un.S_addr = INADDR_ANY;
	if (bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr)) == SOCKET_ERROR)
	{
		printf("bind error!");
	}

	//监听,将listenfd转换为被动套接字,SOMAXCONN为队列最大值
	//被动套接字:accept,主动套接字:connect
	if (listen(listenfd,SOMAXCONN)== SOCKET_ERROR)
	{
		printf("listen error!");
	}
	return listenfd;
}

int main()
{
	//初始化WSA  
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		return 0;
	}

	SOCKET listenSock=InitialSocket();

	//接受,成功返回非负整数,失败返回-1
	struct sockaddr_in peeraddr;
	int peerlen = sizeof(peeraddr);
	SOCKET connSock = accept(listenSock, (sockaddr*)&peeraddr, &peerlen);
	if (connSock < 0)
	{
		printf("accept socket error!");
	}
	
	char recvbuf[1024];
	while (1)
	{
		memset(recvbuf, 0, sizeof(recvbuf));
		//下一句为出问题的代码
		read(connSock,recvbuf,sizeof(recvbuf));
		printf("%s",recvbuf);
	}

    return 0;
}

编译输出…

1>------ 已启动生成: 项目: ConsoleApplicationSock, 配置: Debug x64 ------
1>stdafx.cpp
1>ConsoleApplicationSock.cpp
1>e:\aaa\1project\test\socktest\consoleapplicationsock\consoleapplicationsock\consoleapplicationsock.cpp(66): warning C4244: “参数”: 从“SOCKET”转换到“int”,可能丢失数据
1>e:\aaa\1project\test\socktest\consoleapplicationsock\consoleapplicationsock\consoleapplicationsock.cpp(66): error C4996: ‘read’: The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _read. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17134.0\ucrt\corecrt_io.h(523): note: 参见“read”的声明
1>已完成生成项目“ConsoleApplicationSock.vcxproj”的操作 - 失败。
==========生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

解决办法:
进入“项目”=>“[项目名]属性”
在这里插入图片描述
选择“配置属性”=>“C/C++”=>“预处理器”=>“预处理器定义”=>“编辑”
在这里插入图片描述
在定义框中添加

_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS

在这里插入图片描述
点击“应用”,然后点“确定”,最后重新编译,应该就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值