请教关于WSARecv返回10014错误的问题

nanhaochen 2009-10-31 10:58:24
初学网络编程,写了个简单的程序,就是服务器发现客户端连接后返回欢迎信息
代码如下:
/////////////
Client.cpp
#include "winsock2.h"
#include "stdio.h"

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 2345
#define MAX_BUFFER_SIZE 64
#define Error_Output() DWORD dwErrorID = GetLastError(); \
printf("ErrorID:%d\r\n",dwErrorID);
void InitSock()
{
WSADATA data;
WSAStartup(MAKEWORD(2,2),&data);
}

void ClearSock()
{
WSACleanup();
}

int main()
{
InitSock();
SOCKET socket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED);
if (INVALID_SOCKET == socket)
{
printf("Create Socket Error\r\n");
Error_Output();
ClearSock();
return (-1);
}
SOCKADDR_IN addrServer;
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(SERVER_PORT);
addrServer.sin_addr.s_addr = inet_addr(SERVER_IP);
if (INVALID_SOCKET == WSAConnect(socket,(sockaddr*)&addrServer,sizeof(SOCKADDR_IN),NULL,NULL,NULL,NULL))
{
printf("connet error\n");
Error_Output();
ClearSock();
return (-1);
}
WSABUF DataBuffer ;
DWORD dwRevNum = 0 ;
//char buffer[MAX_BUFFER_SIZE] = {0};
DataBuffer.len = MAX_BUFFER_SIZE;
DataBuffer.buf = new char [MAX_BUFFER_SIZE];
if (SOCKET_ERROR == (WSARecv(socket,&DataBuffer,1,&dwRevNum,0,NULL,NULL)))
{
printf("Recv Error ");
Error_Output();
ClearSock();
return (-1);
}
printf("%s\r\n",DataBuffer.buf);
ClearSock();
getchar();
return 0;
}

///////////
Server.cpp
#include "winsock2.h"
#include "stdio.h"

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 2345
#define MAX_BUFFER_SIZE 30
#define Error_Output() DWORD dwErrorID = GetLastError(); \
printf("ErrorID:%d\r\n",dwErrorID);

void InitSock()
{
WSADATA data;
WSAStartup(MAKEWORD(2,2),&data);
}

void ClearSock()
{
WSACleanup();
}

int main()
{
InitSock();
SOCKET socket ;
if ((socket = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Create socket error\n");
return (-1);
}
SOCKADDR_IN addr,addrClient;
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (SOCKET_ERROR == (bind(socket,(sockaddr*)&addr,sizeof(addr))))
{
printf("Bind error\r\n");
Error_Output();
}
listen(socket,5);
int addrLen = sizeof(sockaddr);
WSABUF wsabuf;
char buffer[MAX_BUFFER_SIZE] = {"Welcome you !!\n"};
wsabuf.buf = buffer;
wsabuf.len = 1;
DWORD dwSentNum;
while(true)
{
SOCKET s = WSAAccept(socket,(sockaddr *)&addrClient,&addrLen,NULL,0);
if (s != INVALID_SOCKET)
{
printf("A new Connet Has Come !!\n");
}
else
{
printf("Accept error\r\n");
Error_Output();
}
if (SOCKET_ERROR == (WSASend(s,&wsabuf,1,&dwSentNum,0,NULL,NULL)))
{
printf("Send Error \r\n");
Error_Output();
}
}
ClearSock();
getchar();
return 0;
}

不知道为什么,客户端接受信息老实失败,返回10014错误
网上查了,有一个说是与缓冲区对齐有关,可是照他的修改后,依然返回错误,麻烦大家帮忙看下,谢谢
...全文
244 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ivan1008 2011-11-17
  • 打赏
  • 举报
回复
楼主人才,我也给了0,也总是失败
whs1980 2009-11-01
  • 打赏
  • 举报
回复
服务器端,这里也应该是buf的大小,按照字节来计算。
wsabuf.len = MAX_BUFFER_SIZE; //这样才对。
nanhaochen 2009-11-01
  • 打赏
  • 举报
回复
呵呵,问题解决了,查看wsarev, 发现,flag参数是inout型参数,我以为是in型,所以直接给了0,
nanhaochen 2009-11-01
  • 打赏
  • 举报
回复
如楼上已经将服务端MAX_BUFFER_SIZE改为通客户端同样大小,并将wsabuf.len = MAX_BUFFER_SIZE;
但问题依旧,客户端依旧返回10014

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧