CCommunicat


TCPcommunicat.h

// TCPcommunicat.h: interface for the CTCPcommunicat class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TCPCOMMUNICAT_H__F903C55C_4E75_4F30_BFC3_D44A969C6C2D__INCLUDED_)
#define AFX_TCPCOMMUNICAT_H__F903C55C_4E75_4F30_BFC3_D44A969C6C2D__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <WINSOCK.H>

class CTCPcommunicat  
{
public:
    CTCPcommunicat();
    virtual ~CTCPcommunicat();

    bool OpenConnect();
    void CloseConnect();
    int SocketRead(char* ciBuffer,long nLen);
    bool SocketSend(char* sSendMsg,int nLen);


    void SetIP(CString sIP){ m_sHostIP= sIP;};
    CString GetIP(){return m_sHostIP;};
    void    SetPort(int nPort){m_iPort = nPort;};
    int GetPort(){ return m_iPort;};
    bool SetParamnetValue(int nType,double dValue);

    bool    m_bConnectSuccess;
private:
    void ReportWinsockErr(LPSTR lpszErrorMsg);


private:
    SOCKET m_hSocket;
    unsigned short m_iPort;
    CString m_sHostIP;
    CString m_sHostName;
    SOCKADDR_IN m_sockAddr;

};



/****************************************************
*              UDP协议类
*
*  使用UDP实现广播,因此在该网络上每台监听的设备都能收到
*
*  UDP协议不仅负责 开始、停止命令的发送,还需要发送开始采集和停止采集的命令(采集需要同步采集)
*
******************************************************/

class CUDPcommunicat
{
public:
    bool GetConnectFlag();
    int Receive(char* ciBuffer,long nLen);
    CUDPcommunicat();
    virtual ~CUDPcommunicat();

    bool Open();
    bool Close();
    
    int Broadcast(char* ciBuffer,long nLen);
    void SetPort(int nPort){m_iPort = nPort;};
    int GetPort(){return m_iPort;}; 
    void SetServerIP(CString sIP){ m_sHostIP= sIP;};

private:
    SOCKET m_hSocket;
    unsigned short m_iPort;
    CString m_sHostIP;
    CString m_sHostName;
    SOCKADDR_IN m_sockAddr;
        
    bool m_bConnectFlag;//链接成功标志

    int  m_nType;//通讯类型  0点发送  1广播
};


#endif // !defined(AFX_TCPCOMMUNICAT_H__F903C55C_4E75_4F30_BFC3_D44A969C6C2D__INCLUDED_)


TCPcommunicat.CPP

// TCPcommunicat.cpp: implementation of the CTCPcommunicat class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TCPcommunicat.h"
#include <iostream>


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTCPcommunicat::CTCPcommunicat()
{
    m_sHostIP = "169.254.184.192";

//  m_sHostIP = "169.254.209.199";
    m_iPort   = 9005;

    m_bConnectSuccess = false;
}

CTCPcommunicat::~CTCPcommunicat()
{
    CloseConnect();
}

void CTCPcommunicat::ReportWinsockErr(LPSTR lpszErrorMsg)
{
    char m_chMsgBuffer[100];
    wsprintf(m_chMsgBuffer,"\nWinsock error %d: %s\n\n", WSAGetLastError(), lpszErrorMsg);
    MessageBeep(MB_ICONSTOP);
    CString sContent(m_chMsgBuffer);
    AfxMessageBox(sContent, NULL, MB_OK | MB_ICONSTOP);
    return;
}


void CTCPcommunicat::CloseConnect()
{
    try{
        closesocket(m_hSocket); // Closes the socket
        WSACleanup(); //terminates use of the Ws2_32.dll
        m_bConnectSuccess = false;
    }
    catch(CException *e)
    {
        delete e;
        throw;
    }
}


bool CTCPcommunicat::OpenConnect()
{
    WSADATA wsaData;
    DWORD dwIPAddr;

    m_bConnectSuccess = false;
    if (WSAStartup(WINSOCK_VERSION, &wsaData))
    {
        AfxMessageBox("Could not load Windows Sockets DLL.",NULL,MB_OK);
        return false;
    }
    
    if((dwIPAddr=inet_addr(m_sHostIP))==INADDR_NONE)
    {
        AfxMessageBox("IPAddress is error!\nPlease input again!",NULL,MB_OK);
        return false;
    }
    else
    {
        m_hSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
        m_sockAddr.sin_family=AF_INET;
        m_sockAddr.sin_port=htons(m_iPort);
        m_sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
        int nConnect=connect(m_hSocket,(LPSOCKADDR)&m_sockAddr,sizeof(m_sockAddr));
        
        if(nConnect)
        {
            ReportWinsockErr("Connect is error!!");
            return false;
        }
        //else
        //  AfxMessageBox("Successfully connected Server!!",NULL,MB_OK);

        fd_set fds;
        FD_ZERO(&fds);
        timeval tv;
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        // wait for permission to send
        FD_SET(m_hSocket, &fds);
        int i = select(32, NULL, &fds, NULL, &tv); // write
        if (i<=0)
        {
            printf("select - error %d\n",WSAGetLastError());
            return false;
        }
    }
    m_bConnectSuccess = true;
    return true;
}

int CTCPcommunicat::SocketRead(char* ciBuffer,long nLen)
{
    if(nLen < 0) return -1;
    
    fd_set fds;
    FD_ZERO(&fds);
    timeval tv;
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    FD_SET(m_hSocket, &fds);
    int i = select(32, &fds, NULL, NULL, &tv); 
    if (i<=0)
    {
        printf("no TCP response received\n");
        return -1;
    }

    int nResult = recv(m_hSocket, ciBuffer, nLen, 0); // returns the number of bytes received
    return nResult;
}

bool CTCPcommunicat::SocketSend(char* sSendMsg,int nLen)
{
    if(nLen < 1) return true;

    int nCharSend=send(m_hSocket,sSendMsg,nLen,0);//0,MSG_OOB
    if(nCharSend==SOCKET_ERROR)
    {
        //AfxMessageBox("Error occurred during send!!",NULL,MB_OK);
        //如果发生错误,清空缓冲区,重新链接
        return false;
    }
    return true;
}

bool CTCPcommunicat::SetParamnetValue(int nType,double dValue)
{
    char readbuffer[100];
    readbuffer[0] = 40;
    readbuffer[1] = nType;

    CString sData;
    sData.Format("%.2f",dValue);
    char  *cAmp;
    cAmp = sData.GetBuffer(sData.GetLength());
    int i;
    for(i=0;i<sData.GetLength();i++)
        readbuffer[2+i] = cAmp[i];
    readbuffer[2+i] = '\n';
    
    SocketSend(readbuffer,100);

    return true;
}




//////////////////////////////////////////////////////////////////////
// Construction/Destruction   
// UDP链接协议 cpp
//////////////////////////////////////////////////////////////////////

CUDPcommunicat::CUDPcommunicat()
{
//  SOCKET m_hSocket;
//  unsigned short m_iPort;
//  CString m_sHostIP;
//  CString m_sHostName;
//  SOCKADDR_IN m_sockAddr; 

    m_sHostIP = "169.254.184.192";
    m_iPort   = 9009;//端口号
    m_nType = 0;//通讯类型  0点发送  1广播
    m_bConnectFlag = false;
}

CUDPcommunicat::~CUDPcommunicat()
{
    Close();
}

bool CUDPcommunicat::Open()
{
    WSADATA wsaData;
//  DWORD dwIPAddr;

    m_bConnectFlag = false;
    if (WSAStartup(WINSOCK_VERSION, &wsaData))
    {
        AfxMessageBox("Could not load Windows Sockets DLL.",NULL,MB_OK);
        return false;
    }
    
    //m_hSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    m_hSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//数据报的形式
    int nBroatcast = 1;//设置为广播
    setsockopt(m_hSocket,SOL_SOCKET,SO_BROADCAST,(CHAR*)&nBroatcast,sizeof(nBroatcast) );

    m_sockAddr.sin_family=AF_INET;
    m_sockAddr.sin_port=htons(m_iPort);
    m_sockAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//网段内全部发送
    
    //绑定地址
    if(bind( m_hSocket,(SOCKADDR *)&m_sockAddr,sizeof(m_sockAddr))!=0)
    {
        printf("Can't bind socket to local port!Program stop.\n");//初始化失败返回-1
        return false;
    }
            
    m_bConnectFlag = true;
    return true;
}

bool CUDPcommunicat::Close()
{
    try{
        closesocket(m_hSocket); // Closes the socket
        WSACleanup(); //terminates use of the Ws2_32.dll
        m_bConnectFlag = false;
    }
    catch(CException *e)
    {
        delete e;
        return false;
    }
    return true;
}


int CUDPcommunicat::Broadcast(char* ciBuffer,long nLen)
{
    SOCKADDR_IN  addSend;//广播发送地址
    
    addSend.sin_family = AF_INET;
    addSend.sin_addr.s_addr = htonl(INADDR_BROADCAST );
    addSend.sin_port = htons(m_iPort);//发送用的端口,可以根据需要更改
    //nSize = sizeof ( SOCKADDR_IN );}

    return sendto(m_hSocket,ciBuffer,nLen,0,(SOCKADDR*)&addSend,sizeof(SOCKADDR_IN) );
}

int CUDPcommunicat::Receive(char* ciBuffer,long nLen)
{
    SOCKADDR_IN saClient;//收到的客户端地址
    int nSize = sizeof(SOCKADDR_IN);
    int nbSize = 0;
    
    if( (nbSize=recvfrom (m_hSocket,ciBuffer,nLen,0,(SOCKADDR FAR *) &saClient,&nSize))==SOCKET_ERROR )
            return -1;

    return nbSize;
}

//获得链接状态
bool CUDPcommunicat::GetConnectFlag()
{
    return m_bConnectFlag;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容