#include <iostream>
#include "Send.h"
using namespace std;
Send::Send(void)
{
m_socket = INVALID_SOCKET;
WSAData ws;
//每个Winsock程序必须使用WSAStartup载入合适的Winsock动态链接库,如果载入失败,WSAStartup将返回SOCKET_ERROR,这个错误就是WSANOTINITIALISED
if (WSAStartup(MAKEWORD(1,1),&ws)!=0)
{
cout<<"WSAStartup failed! Error: "<<WSAGetLastError()<<endl;
}
}
Send::~Send(void)
{
WSACleanup();
}
bool Send::InitSocket(const string strIPAddress,const string strPort)
{
//创建套接字,ipv4,报文,udp协议
m_socket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//创建socket失败
if (INVALID_SOCKET == m_socket)
{
cout<<"failed to create socket"<<endl;
return false;
}
//初始化sock地址
InitSockAddress(strIPAddress,strPort);
// 绑定
if (bind (m_socket,
(struct sockaddr FAR *) &m_sockLocalAddress,
sizeof (m_sockLocalAddress)) == SOCKET_ERROR)
{
//报错
cout<<"Binding socket failed! Error: "<<WSAGetLastError()<<endl;
closesocket (m_socket);
return false;
}
int iOptVal=64; //1秒
// 设置组播存活时间
if (setsockopt (m_socket,
IPPROTO_IP,
3,
(char FAR *)&iOptVal,
sizeof (int)) == SOCKET_ERROR)
{
//报错
cout<<"setsockopt failed! Error:"<<WSAGetLastError()<<endl;
closesocket (m_socket);
return false;
}
return true;
}
void Send::CleanSocket()
{
shutdown(m_socket,0x01);
closesocket(m_socket);
}
bool Send::SendStringData(const string strMessage)
{
if (sendto (m_socket,
(char *)&strMessage,
sizeof(strMessage),
0,
(struct sockaddr FAR *) &m_sockDesAddress,
sizeof (m_sockDesAddress)) == SOCKET_ERROR)
{
//报错
cout<<"sendto failed! Error: %d"<<WSAGetLastError ()<<endl;
closesocket (m_socket);
return false;
}
else
{
return true;
}
}
bool Send::SendStructeData(const Person person)
{
if (sendto (m_socket,
(char *)&person,
sizeof(person),
0,
(struct sockaddr FAR *) &m_sockDesAddress,
sizeof (m_sockDesAddress)) == SOCKET_ERROR)
{
//报错
cout<<"sendto failed! Error: %d"<<WSAGetLastError ()<<endl;
closesocket (m_socket);
return false;
}
else
{
return true;
}
}
void Send::InitSockAddress(const string strIPAddress,const string strPort)
{
//本地sock地址设置
m_sockLocalAddress.sin_family = AF_INET; //ipv4地址类型
m_sockLocalAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
m_sockLocalAddress.sin_port = htons(0);
memset(m_sockLocalAddress.sin_zero,0,8);
//目的sock地址设置
//IPv4版本
m_sockDesAddress.sin_family = AF_INET;
//端口
m_sockDesAddress.sin_port = htons (atol(strPort.c_str()));
//地址
m_sockDesAddress.sin_addr.s_addr = inet_addr (strIPAddress.c_str());
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/18613.html