-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSynchronousSocket.cpp
More file actions
127 lines (121 loc) · 2.87 KB
/
SynchronousSocket.cpp
File metadata and controls
127 lines (121 loc) · 2.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "stdafx.h"
#include "SynchronousSocket.h"
#include "UIDemoDlg.h"
CSynchronousSocket::CSynchronousSocket(void)
{
m_Socket = INVALID_SOCKET ;
IsEnd = true;
}
CSynchronousSocket::~CSynchronousSocket(void)
{
m_Socket = INVALID_SOCKET ;
IsEnd = true;
OnClose();
}
BOOL CSynchronousSocket::OnInitSocket()
{
buffer.clear();
RecvDataThread();
return TRUE ;
}
SOCKET CSynchronousSocket::OnConnnect(const char *pIpAddr, WORD nPort)
{
struct sockaddr_in servAddr;
SOCKET hSocket = INVALID_SOCKET;
memset(&servAddr, 0, sizeof(struct sockaddr_in));
servAddr.sin_family = AF_INET;
servAddr.sin_port = htons(18332);
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (servAddr.sin_addr.s_addr != INADDR_NONE){
if ((hSocket = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET){
if (connect(hSocket, (struct sockaddr *)&servAddr, sizeof(struct sockaddr_in)) == 0){
m_Socket = hSocket;
}else{
int error;
error = WSAGetLastError();
hSocket = INVALID_SOCKET;
closesocket(hSocket);
}
}
}
return hSocket ;
}
BOOL CSynchronousSocket::OnSend(const char* sCmdBuff , int nLen)
{
if ( INVALID_SOCKET == m_Socket || NULL == sCmdBuff || 0 == nLen ) return FALSE ;
if (send(m_Socket, sCmdBuff, nLen, 0) == -1){
return FALSE ;
}
return TRUE ;
}
void CSynchronousSocket::RecvDataThread()
{
HANDLE hRecvThread;
UINT uRecvThreadId = 0;
hRecvThread = (HANDLE)_beginthreadex(NULL, 0, RecvDataProc,this,CREATE_SUSPENDED, &uRecvThreadId);
if ( hRecvThread != INVALID_HANDLE_VALUE)
{
SetThreadPriority(hRecvThread, THREAD_PRIORITY_NORMAL);
ResumeThread( hRecvThread );
}
}
int CSynchronousSocket::GetRpcRes(const string ip,int port,string cmd,string & rev,int timerout)
{
CSynchronousSocket te;
if(te.OnInitSocket())
if (te.OnConnnect(ip.c_str(),port))
if(te.OnSend(cmd.c_str(),cmd.length()))
{
do
{
if(timerout < 0)
{
return -1;
}
timerout -= 100;
Sleep(100);
} while (te.IsEnd==false);
}
string tep(te.buffer.begin(),te.buffer.end());
rev =tep;
return rev.length();
}
UINT WINAPI CSynchronousSocket::RecvDataProc(LPVOID pParam)
{
unsigned char tempbuffer[10*1024];
CSynchronousSocket * pRecv = (CSynchronousSocket*)pParam ;
bool isSartRev = false;
pRecv -> IsEnd = false;
if ( NULL != pRecv ) {
while (true)
{
if ( INVALID_SOCKET != pRecv->m_Socket) {
isSartRev = true;
memset(tempbuffer,0,sizeof(tempbuffer));
int bufferSize = sizeof(tempbuffer) - 1;
int nRes = recv( pRecv->m_Socket , (char*)tempbuffer , bufferSize , 0);
if ( nRes > 0) {
pRecv->buffer.insert(pRecv->buffer.end(),tempbuffer,tempbuffer+nRes);
continue;
}
else
{
break;
}
}
else if(isSartRev == true)
{
break;
}
}
}
pRecv -> IsEnd = true;
return 0;
}
void CSynchronousSocket::OnClose()
{
if ( m_Socket !=INVALID_SOCKET ) {
closesocket(m_Socket);
m_Socket = INVALID_SOCKET ;
}
}