WUDP.H#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#define MAXSIZE 512
#pragma onceclass CWUdp
{
public:
CWUdp(void);
~CWUdp(void);
public:
BOOL InitWSA();
BOOL InitSocket();
void Bind(const char * serverIP, short serverPort);
BOOL SendBuffer(char * buffer, int len);
BOOL RecvBuffer(char * buffer);
BOOL ServerBind(short ServerPort);
BOOL SetServerOpt();
void CloseSocket();
private:
WSADATA m_WSA;
SOCKET m_socket;
SOCKADDR_IN m_servAddr;
int m_nServAddlen;

};
WUDP.CPP#include "StdAfx.h"
#include "WUdp.h"CWUdp::CWUdp(void)
{
}CWUdp::~CWUdp(void)
{
}
BOOL CWUdp::InitWSA()
{ if (WSAStartup(MAKEWORD(2,2), &m_WSA) != 0)
{
return FALSE;
} return TRUE;
}
BOOL CWUdp::InitSocket()
{
//创建套接字
m_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_socket == INVALID_SOCKET)
{
printf("socket() failed; %d\n", WSAGetLastError());
WSACleanup();//释放套接字资源
return FALSE;
}
return TRUE;
}
void CWUdp::Bind(const char * serverIP, short serverPort)
{
//服务器地址
m_servAddr.sin_family =AF_INET;
m_servAddr.sin_addr.s_addr = inet_addr(serverIP);
m_servAddr.sin_port = htons(serverPort);
m_nServAddlen  = sizeof(m_servAddr);
}
BOOL CWUdp::SendBuffer(char * buffer, int size)
{
if(sendto(m_socket, buffer, size, 0, (SOCKADDR*)&m_servAddr, m_nServAddlen) == SOCKET_ERROR)
{
printf("sendto() failed: %d\n", WSAGetLastError());
closesocket(m_socket); //关闭套接字
WSACleanup(); //释放套接字资源
return FALSE;
}
return TRUE;}BOOL CWUdp::RecvBuffer(char * buffer)
{
//接收数据
SOCKADDR_IN clientAddr;
int nClientLen = sizeof(clientAddr);
ZeroMemory(buffer, MAXSIZE);
if(recvfrom(m_socket, buffer, 64, 0, (SOCKADDR*)&clientAddr, &nClientLen) == SOCKET_ERROR)
{
printf("recvfrom() failed: %d\n", WSAGetLastError());
closesocket(m_socket); //关闭套接字
WSACleanup(); //释放套接字资源
return FALSE;
} // printf("%s\n", buf);//输出"MyUDP"
return TRUE;
}
BOOL CWUdp::SetServerOpt()
{
int nErrCode; //返回值
int nBufLen; //接收数据缓冲区大小
int nOptlen = sizeof(nBufLen);
//获取接收数据缓冲区大小
nErrCode = getsockopt(m_socket, SOL_SOCKET, SO_RCVBUF,(char*)&nBufLen, &nOptlen);
if (SOCKET_ERROR == nErrCode)
{
return FALSE;
} //设置接收数据缓冲区为原来的10倍
nBufLen *= 10;
nErrCode = setsockopt(m_socket, SOL_SOCKET, SO_RCVBUF,(char*)&nBufLen, nOptlen);
if (SOCKET_ERROR == nErrCode)
{
return FALSE;
} //检查设置系统接收数据缓冲区是否成功
int uiNewRcvBuf;
getsockopt(m_socket, SOL_SOCKET, SO_RCVBUF,(char*)&uiNewRcvBuf, &nOptlen);
if (SOCKET_ERROR == nErrCode || uiNewRcvBuf != nBufLen)
{
return FALSE;
} return TRUE;
}
BOOL CWUdp::ServerBind(short ServerPort)
{
//服务器地址
m_servAddr.sin_family = AF_INET;
m_servAddr.sin_port = htons(ServerPort); //端口
m_servAddr.sin_addr.s_addr = htonl(INADDR_ANY); //IP //绑定
if (bind(m_socket, (SOCKADDR *)&m_servAddr, sizeof(m_servAddr)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
closesocket(m_socket); //关闭套接字
WSACleanup(); //释放套接字资源
return FALSE;
} return TRUE;
}
void CWUdp::CloseSocket()
{
closesocket(m_socket); //关闭套接字   
WSACleanup(); //释放套接字资源
}
调用 CWUdp wudp;
BOOL bl;
bl = wudp.InitWSA();
bl = wudp.InitSocket();
bl = wudp.SetServerOpt();
bl = wudp.ServerBind(5000);
        char buf[10] = {0};
        bl = wudp.RecvBuffer(buf);       //此处失败 错误代码10038