.h
#pragma once
#define PORT 4567#ifdef WIN32
#include "WinSock2.h"
#pragma comment(lib, "ws2_32.lib")
#else
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
//typedef int SOCKET
//typedef sockadd_in SOCKADDR_IN
#endif
class FKSocketUDP
{
int m_Socket;
public:
//*************************************************
//功能:实现UDP的封装
//*************************************************
bool myInitialize(); //初始化套接字
//*************************************************
//功能:创建socket
//*************************************************
void mySocket();
//*************************************************
//功能:设置成广播模式
//*************************************************
void myRadioUDP(); //广播
//*************************************************
//功能:绑定套接字
//*************************************************
void myBind();
//*************************************************
//功能:单播,点对点
//*************************************************
void unicastUDP();
//*************************************************
//功能:广播时对整个端口发送数据
//*************************************************
void sendUDP(); //发送
//*************************************************
//功能:单播发送
//参数:指定要发送数据的IP地址
//*************************************************
int sendUDP(char *buf ,int length,void * ip);
//*************************************************
//功能:接受数据
//参数:buf缓冲区
// length表示缓冲区长度
//*************************************************
char recvUDP(char *buf ,int length); //接收
//*************************************************
//功能:关闭套接字
//*************************************************
void myClose(); //关闭
//*************************************************
//功能:广播
//参数:buf缓冲区
// length表示缓冲区长度
// 传IP地址
//*************************************************
int recvUDP(char *buf ,int length,void * &ip);
//*************************************************
//功能:广播
//参数:buf缓冲区
// length表示缓冲区长度
// IP地址引用了发送时的IP
// port是端口号 他引用了绑定时的端口
//返回值:1表示接收成功,0表示连接断开,-1表示接收错误
//*************************************************
int recvUDP(char *buf ,int length,void * &ip,unsigned short &port);
FKSocketUDP();
~FKSocketUDP(void);
};
.cpp
#include "FKSocketUDP.h"
//#include <Strsafe.h>
//初始化套接字
bool FKSocketUDP::myInitialize()
{
#ifdef WIN32
WSADATA WSAData;
unsigned short wVersion = MAKEWORD(2,0);
if (WSAStartup(wVersion,&WSAData))
{
WSACleanup();
exit(0);
}
#endif
}
//创建socket
void FKSocketUDP::mySocket()
{
//m_Socket = socket(2, 2, 17);//IPPROTO_UDP UDP协议
m_Socket = socket(AF_INET, SOCK_DGRAM, 0);
if (m_Socket == NULL)
{
//Sleep(3000);
exit(0);
}
}
//绑定套接字
void FKSocketUDP::myBind()
{
sockaddr_in addr;
addr.sin_family = 2;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = 0x00000000; //固定IP inet_addr( "127.0.0.1");
if (-1 == bind(m_Socket,(sockaddr *)&addr,sizeof (addr)) )
{
#ifdef WIN32
closesocket(m_Socket);
return;
#endif
}
}
void FKSocketUDP::myRadioUDP()//广播
{
bool True = true;
//设置该套接字为广播类型
setsockopt(m_Socket, 0xffff, 0x0020, (char*)&True, sizeof(True));
}
//广播发送
void FKSocketUDP::sendUDP()
{
char buf[256]="Are You Sleeping ?\0\r\n";
int sock_addr = sizeof(sockaddr);
sockaddr_in addr;
addr.sin_family = 2;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = 0xffffffff;
int SendTo = sendto(m_Socket, buf, strlen(buf), 0, (sockaddr*)&addr, sock_addr);
}
int FKSocketUDP::sendUDP(char *buf ,int length,void * ip)
{
int sock_addr = sizeof(sockaddr);
sockaddr_in addr;
addr.sin_family = 2;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = (unsigned long) ip;
return sendto(m_Socket, buf, strlen(buf), 0, (sockaddr*)&addr, sock_addr);
}
char FKSocketUDP::recvUDP(char *buf, int length)
{
sockaddr_in addr;
int iLen = sizeof(addr);
int iResult = recvfrom(m_Socket, buf, 256, 0, (sockaddr *)&addr, &iLen);
return iResult;
}
int FKSocketUDP::recvUDP(char *buf ,int length, void * &ip )
{
sockaddr_in addr;
int iLen = sizeof(addr);
int iReturn = recvfrom(m_Socket, buf, 256, 0, (sockaddr *)&addr, &iLen);
ip = (void *)addr.sin_addr.s_addr;
return iReturn;
}
int FKSocketUDP::recvUDP(char *buf ,int length, void * &ip,unsigned short &port )
{
int iResult;
sockaddr_in addr;
int iLen = sizeof(addr);
iResult = recvfrom(m_Socket, buf, 256, 0, (sockaddr *)&addr, &iLen);
ip=(void*)addr.sin_addr.s_addr;
port=addr.sin_port;
return iResult;
}
FKSocketUDP::FKSocketUDP()
{
static bool state = myInitialize();
mySocket();
myRadioUDP();
myBind();
}
FKSocketUDP::~FKSocketUDP(void)
{
myClose();
}
void FKSocketUDP::myClose()//关闭
{
#ifdef WIN32
closesocket(m_Socket);
WSACleanup();
#else
// close(m_Socket);
exit(0);
#endif
}
//单播
void FKSocketUDP::unicastUDP()
{
}