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;
}
以上是个人拙见, 若有更好的方法请指教小弟, 谢谢! 谢谢! 谢谢!
全部评论 (0)
还没有任何评论哟~
