初学网络编程,写了个简单的程序,就是服务器发现客户端连接后返回欢迎信息
代码如下:
/////////////
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错误
网上查了,有一个说是与缓冲区对齐有关,可是照他的修改后,依然返回错误,麻烦大家帮忙看下,谢谢

解决方案 »

  1.   

    服务器端,这里也应该是buf的大小,按照字节来计算。
    wsabuf.len = MAX_BUFFER_SIZE; //这样才对。
      

  2.   

    如楼上已经将服务端MAX_BUFFER_SIZE改为通客户端同样大小,并将wsabuf.len = MAX_BUFFER_SIZE;
    但问题依旧,客户端依旧返回10014
      

  3.   

    呵呵,问题解决了,查看wsarev, 发现,flag参数是inout型参数,我以为是in型,所以直接给了0,