udp 封装 可自发自收

.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()
{


}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值