Advertisement

C++ TCP客户端网络消息发送接收同步实现

阅读量:

废话不多说, 直入主题, 我们在写客户单的时候希望在哪里发消息出去,然后在哪里返回消息(同步), 然后继续往下运行-, 而不是在这里发送了一个消息给服务端, 在另一个地方接受消息(异步) , 也不知道等多久, 才收到消息, 等收到消息在通知发送消息的地方, 让程序继续往下运行, 这样想想异步实在太麻烦了,

实现同步的思想: 1 将socket设置成阻塞的, 2: 设置接受超时, 3: 消息类型区分

直接上代码

封装socket 头文件

复制代码
 #pragma once

    
 #include <string>
    
 #include <Winsock2.h>
    
  
    
 using namespace std;
    
 class TcpSocket
    
 {
    
 public:
    
 	TcpSocket();
    
 	~TcpSocket();
    
  
    
 	bool SocketInit();
    
 	bool CreatSocket(string strIp, int nPort);
    
 	bool SendMsg(int msgType, string strSendBuf, string& strRecvMsg, int iTimeOut);
    
  
    
 private:
    
 	SOCKET m_Scoket;
    
 	DWORD m_dwVserion;
    
 	WSADATA m_WsData;
    
 	int m_iError;
    
 	bool m_isSocketFlag;
    
 };

socket封装实现

复制代码
    "TcpSocket.h"#pragma#pragma
    
    TcpSocket::TcpSocket()
    {
    m_dwVserion 0;
    m_isSocketFlag true;
    memset(0sizeof(WSADATA));
    }
    
    
    TcpSocket::TcpSocket()
    {
    closesocket(m_Scoket);
    WSACleanup();
    }
    
    bool TcpSocket::SocketInit()
    {
    m_dwVserion 11);
    m_iError m_WsData);
    if0)
    {
        printf("socket 初始化操作失败");
        m_isSocketFlag false;
    }
    if11)
    {
        WSACleanup();
        m_isSocketFlag false;
    }
    return m_isSocketFlag;
    }
    
    boolstringint nPort)
    {
    ifm_isSocketFlag)
        returnfalse;
    m_Scoket 0);
    SOCKADDR_IN addr;
    addr.sin_addr.S_un.S_addr  inet_addr(strIp.c_str());
    addr.sin_family  AF_INET;
    addr.sin_port  htons(nPort);
    
    m_iError sizeof(SOCKADDR));
    if0)
        m_isSocketFlag false;
    return m_isSocketFlag;
    }
    
    boolintstringstringint iTimeOut)
    {
    ifm_isSocketFlag)
        returnfalse;
    int1000//秒charsizeof(timeOut));
    setsockopt(m_Scoket, SOL_SOCKET, SO_RCVTIMEO, (charsizeof(timeOut));
    printf("开始发送消息\n");
    int0);
    if0)
    {
        printf("发送消息超时\n");
        returnfalse;
    }
    printf("发送消息: %s\n", strSendBuf.c_str());
    char10240 };
    iRet sizeof0);
    if1)
    {
        printf("接受消息超时\n");
        returnfalse;
    }
    stringstring(recvBuf);
    ifstring::npos)
        returnfalse;
    strRecvMsg string(recvBuf);
    returntrue;
    }

测试程序:

复制代码
    #include "TcpSocket.h"int main()
    {
    TcpSocket client;
    bool client.SocketInit();
    ifisRet)
        return0;
    isRet "10.1.1.66"2345);
    
    if (isRet)
    {
        while1)
        {
            stringstring();
            client.SendMsg(1string"Hello"5);
            printf("接受消息: %s\n", strRecv.c_str());
            Sleep(200);
        }
    }
    getchar();
    return0;
    }

以上是个人拙见, 若有更好的方法请指教小弟, 谢谢! 谢谢! 谢谢!

转载于:https://www.cnblogs.com/hul201610101100/p/9989729.html

全部评论 (0)

还没有任何评论哟~