在写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
点击“应用”,然后点“确定”,最后重新编译,应该就可以了。