📄 mysocket.cpp
字号:
// mysocket.cpp: implementation of the mysocket class.
//
//////////////////////////////////////////////////////////////////////
#include<afxwin.h>
#include<afxsock.h>
#include "mysocket.h"
#include"Display.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
mysocket::mysocket()
{
log.Open("socket.txt",CFile::modeCreate | CFile::modeWrite);
closeflag=0;
name="";
}
void mysocket::setparent(CDialog *dialog)
{
dlg=dialog;
closeflag=0;
}
//////////////////////////////////////////////
//
// Create Sending and receiving socket using Multicast group address
// and port..
//
BOOL mysocket::createSocket(char gaddr[],int gport)
{
int ttl=8; //any arbitrary value greater than 1
char str[200];
sprintf(str,"\n Creating socket... %s , port= %d ",gaddr,gport);
log.WriteString(str);
//Create Receiver socket
if(!Create(gport,SOCK_DGRAM, FD_READ) )
{
sprintf(str,"\nError %d ",GetLastError());
log.WriteString("\n JOIN : Create failed");
log.WriteString(str);
AfxMessageBox("Join:: Create failed");
return FALSE;
}
BOOL bMultipleApps = TRUE; /* allow reuse of local port if needed */
SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(BOOL), SOL_SOCKET);
log.WriteString("\n Receiving socket create successfully");
/* Join the multicast group */
mreq.imr_multiaddr.s_addr = inet_addr(gaddr); /* group addr */
mreq.imr_interface.s_addr = htons(INADDR_ANY); /* use default */
if(setsockopt(m_hSocket,IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&mreq,sizeof(mreq))!=0 )
{
sprintf(str,"got error %d",WSAGetLastError());
log.WriteString(str);
log.WriteString("\n JOIN :Adding member failed");
AfxMessageBox("Join:: Adding member failed");
return FALSE;
}
//Prepare for sending
//Create sending hostgroup
memset(&hgroup, 0, sizeof(hgroup));
hgroup.sin_family = AF_INET;
hgroup.sin_addr.s_addr = inet_addr(gaddr);
hgroup.sin_port = htons((USHORT)gport);
if(!send.Create(0, SOCK_DGRAM, 0 ) ) // Create an connectionless UDP socket
{
AfxMessageBox("Join :: Creation of sending socket failed");
return FALSE;
}
GetSockName(myaddr,myport);
sprintf(str,"\n Created from address %s %d",(LPCTSTR)myaddr,myport);
log.WriteString(str);
if(!setTTL(ttl)) // Set Time to Live as specified by user
{
AfxMessageBox("Joing :: Error Setting TTL");
return FALSE;
}
//setLoopBack(lback); // Enable/Disable Loopback
return TRUE;
}
//////////////////////////////////////////////
//
// Set the TTL value for multicast packet...
//
BOOL mysocket::setTTL(int ttl)
{
BOOL lback=TRUE;
/* Set Time to Live to parameter TTL */
if(send.SetSockOpt(IP_MULTICAST_TTL, &ttl, sizeof(int), IPPROTO_IP) == 0)
return FALSE; /* Error Setting TTL */
return TRUE;
}
//
// This function will be invoked when the client receives message
// from remote socket
// Display class's receive function will process the message
void mysocket::OnReceive(int errcode)
{
if(errcode==0)
((Display*)dlg)->Receive();
CAsyncSocket::OnReceive(errcode);
}
////////////////////////////////////////
//
// If group is closed then close the application
//
void mysocket::OnClose(int errcode)
{
closeflag=1;
log.Close();
((Display*)dlg)->OnCancel();
}
//Not used......
void mysocket::sendMesg(char *mesg,int len)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -