瀏覽代碼

send entire clip at a time, i was breaking up the clip into sections and sending it. I now send one truct saying what I'm about to send and the size then send the entire data for a clip.

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@98 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 21 年之前
父節點
當前提交
5880b3a435
共有 6 個文件被更改,包括 95 次插入102 次删除
  1. 30 36
      Client.cpp
  2. 2 1
      Client.h
  3. 7 0
      Misc.cpp
  4. 2 0
      Misc.h
  5. 45 54
      Server.cpp
  6. 9 11
      Server.h

+ 30 - 36
Client.cpp

@@ -174,8 +174,8 @@ BOOL CClient::CloseConnection()
 {
 	if(m_Connection != NULL && m_Connection != 0)
 	{
-		SendInfo Info;
-		SendData(&Info, MyEnums::EXIT);
+		CSendInfo Info;
+		SendCSendData(Info, MyEnums::EXIT);
 
 		closesocket(m_Connection);
 		WSACleanup();
@@ -244,77 +244,67 @@ BOOL CClient::OpenConnection(const char* servername)
 
 BOOL CClient::SendItem(CClip *pClip)
 {
-	SendInfo Info;
+	CSendInfo Info;
 	
 	strncpy(Info.m_cComputerName, GetComputerName(), sizeof(Info.m_cComputerName));
 	strncpy(Info.m_cIP, GetIPAddress(), sizeof(Info.m_cIP));
-	strncpy(Info.m_cText, pClip->m_Desc, sizeof(Info.m_cText));
+	strncpy(Info.m_cDesc, pClip->m_Desc, sizeof(Info.m_cDesc));
 	
-	Info.m_cText[sizeof(Info.m_cText)-1] = 0;
+	Info.m_cDesc[sizeof(Info.m_cDesc)-1] = 0;
 	Info.m_cComputerName[sizeof(Info.m_cComputerName)-1] = 0;
 	Info.m_cIP[sizeof(Info.m_cIP)-1] = 0;
 
-	if(SendData(&Info, MyEnums::START) == FALSE)
+	if(SendCSendData(Info, MyEnums::START) == FALSE)
 		return FALSE;
 	
 	CClipFormat* pCF;
 	
 	int nCount = pClip->m_Formats.GetSize();
-	DWORD dwSize;
-	DWORD dwDataSent;
 
 	//For each data type
 	for( int i=0; i < nCount; i++ )
 	{
 		pCF = &pClip->m_Formats.GetData()[i];
 		
-		Info.m_lParameter1 = dwSize = GlobalSize(pCF->m_hgData);
-		strncpy(Info.m_cText, GetFormatName(pCF->m_cfType), sizeof(Info.m_cText));
-		Info.m_cText[sizeof(Info.m_cText)-1] = 0;
+		Info.m_lParameter1 = GlobalSize(pCF->m_hgData);
+		strncpy(Info.m_cDesc, GetFormatName(pCF->m_cfType), sizeof(Info.m_cDesc));
+		Info.m_cDesc[sizeof(Info.m_cDesc)-1] = 0;
 
-		if(SendData(&Info, MyEnums::DATA_START) == FALSE)
+		if(SendCSendData(Info, MyEnums::DATA_START) == FALSE)
 			return FALSE;
 
-		dwDataSent = 0;
-		while(dwDataSent < dwSize)
-		{
-			LPVOID pvData = GlobalLock(pCF->m_hgData);
-
-			if(dwSize - dwDataSent < MAX_DATA_SIZE)
-				Info.m_lParameter1 = dwSize - dwDataSent;
-			else
-				Info.m_lParameter1 = MAX_DATA_SIZE;
-
-			memcpy(Info.m_cText,  ((char*)pvData) + dwDataSent, Info.m_lParameter1);
+		LPVOID pvData = GlobalLock(pCF->m_hgData);
 
-			GlobalUnlock(pCF->m_hgData);
-
-			if(SendData(&Info, MyEnums::DATA) == FALSE)
-				return FALSE;
-
-			dwDataSent += Info.m_lParameter1;
-		}
+		SendExactSize((char*)pvData, Info.m_lParameter1);
 
-		if(SendData(&Info, MyEnums::DATA_END) == FALSE)
+		GlobalUnlock(pCF->m_hgData);
+		
+		if(SendCSendData(Info, MyEnums::DATA_END) == FALSE)
 			return FALSE;
 	}
 	
-	if(SendData(&Info, MyEnums::END) == FALSE)
+	if(SendCSendData(Info, MyEnums::END) == FALSE)
 		return FALSE;
+
+	theApp.m_lClipsSent++;
 	
 	return TRUE;
 }
 
-BOOL CClient::SendData(SendInfo *pInfo, MyEnums::eSendType type)
+BOOL CClient::SendCSendData(CSendInfo &data, MyEnums::eSendType type)
 {
-	pInfo->m_Type = type;
+	data.m_Type = type;
+	return SendExactSize((char *)&data, sizeof(CSendInfo));
+}
 
+BOOL CClient::SendExactSize(char *pData, long lLength)
+{
 	long lBytesRead = 0;
-	long lExpected = sizeof(SendInfo);
+	long lExpected = lLength;
 
 	while(lBytesRead < lExpected)
 	{
-		long lSize = send(m_Connection, ((char *)pInfo) + lBytesRead, lExpected - lBytesRead, 0);
+		long lSize = send(m_Connection, pData + lBytesRead, lExpected - lBytesRead, 0);
 	
 		if(lSize == SOCKET_ERROR || lSize == 0)
 		{
@@ -322,7 +312,11 @@ BOOL CClient::SendData(SendInfo *pInfo, MyEnums::eSendType type)
 			return FALSE;
 		}
 		lBytesRead += lSize;
+
+		LogSendRecieveInfo(StrF("SendExactSize Last Size %d - Total %d", lSize, lBytesRead));
 	}
 
+	LogSendRecieveInfo(StrF("END SendExactSize Total %d", lBytesRead));
+
 	return TRUE;
 }

+ 2 - 1
Client.h

@@ -51,7 +51,8 @@ public:
 protected:
 	SOCKET m_Connection;
 
-	BOOL SendData(SendInfo *pInfo, MyEnums::eSendType type);
+	BOOL SendCSendData(CSendInfo &data, MyEnums::eSendType type);
+	BOOL SendExactSize(char *pData, long lLength);
 };
 
 BOOL SendToFriend(CSendToFriendInfo &Info);

+ 7 - 0
Misc.cpp

@@ -274,6 +274,13 @@ HGLOBAL NewGlobalP( LPVOID pBuf, UINT nLen )
 	return hDest;
 }
 
+HGLOBAL NewGlobal(UINT nLen)
+{
+	ASSERT(nLen);
+	HGLOBAL hDest = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, nLen);
+	return hDest;
+}
+
 HGLOBAL NewGlobalH( HGLOBAL hSource, UINT nLen )
 {
 	ASSERT( hSource && nLen );

+ 2 - 0
Misc.h

@@ -58,9 +58,11 @@ void CopyToGlobalHP( HGLOBAL hDest, LPVOID pBuf, ULONG ulBufLen );
 void CopyToGlobalHH( HGLOBAL hDest, HGLOBAL hSource, ULONG ulBufLen );
 HGLOBAL NewGlobalP( LPVOID pBuf, UINT nLen );
 HGLOBAL NewGlobalH( HGLOBAL hSource, UINT nLen );
+HGLOBAL NewGlobal(UINT nLen);
 int CompareGlobalHP( HGLOBAL hLeft, LPVOID pBuf, ULONG ulBufLen );
 int CompareGlobalHH( HGLOBAL hLeft, HGLOBAL hRight, ULONG ulBufLen );
 
+
 int GetScreenWidth();
 int GetScreenHeight();
 void GetMonitorRect(int iMonitor, LPRECT lpDestRect);

+ 45 - 54
Server.cpp

@@ -68,16 +68,16 @@ UINT  MTServerThread(LPVOID pParam)
 	return 0;
 }
 
-BOOL Recv(SOCKET sock, SendInfo *pInfo)
+BOOL RecieveExactSize(SOCKET sock, char *pData, long lSize)
 {
 	long lReceiveCount = 0;
 
-	long lWanted = sizeof(SendInfo);
+	long lWanted = lSize;
 	long lOffset = 0;
 
 	while(lWanted > 0)
 	{
-		lReceiveCount = recv(sock, ((char*)pInfo) + lOffset, lWanted, 0);
+		lReceiveCount = recv(sock, pData + lOffset, lWanted, 0);
 		if(lReceiveCount == SOCKET_ERROR)
 		{
 			LogSendRecieveInfo("********ERROR if(lReceiveCount == SOCKET_ERROR)*******");
@@ -95,13 +95,20 @@ BOOL Recv(SOCKET sock, SendInfo *pInfo)
 		lOffset += lReceiveCount;
 	}
 
-	if(pInfo->m_nSize != lOffset)
+	LogSendRecieveInfo(StrF("------END RecieveExactSize Recieved %d", lOffset));
+
+	return TRUE;
+}
+
+BOOL RecieveCSendInfo(SOCKET sock, CSendInfo *pInfo)
+{
+	BOOL bRet = RecieveExactSize(sock, (char*)pInfo, sizeof(CSendInfo));
+	if(bRet)
 	{
-		LogSendRecieveInfo(StrF("------ERROR Incoming struct size %d Expected Size %d", pInfo->m_nSize, lWanted));
-		return FALSE;
+		bRet = pInfo->m_nSize == sizeof(CSendInfo);
 	}
 
-	return TRUE;
+	return bRet;
 }
 
 UINT  ClientThread(LPVOID pParam)
@@ -113,17 +120,13 @@ UINT  ClientThread(LPVOID pParam)
 	CClipList *pClipList = NULL;
 	CClip *pClip = NULL;
 	CClipFormat cf;
-	SendInfo info;
-	int nRecvReturn = 0;
-	long lBytesCopied;
+	CSendInfo info;
 	bool bBreak = false;
-	BYTE *pByte = NULL;
-	long lByteSize = 0;
 	BOOL bSetToClipBoard = FALSE;
 	
 	while(true)
 	{
-		if(Recv(socket, &info) == FALSE)
+		if(RecieveCSendInfo(socket, &info) == FALSE)
 			break;
 		
 		switch(info.m_Type)
@@ -139,7 +142,7 @@ UINT  ClientThread(LPVOID pParam)
 				pClip = new CClip;
 				
 				CString cs;
-				cs.Format("%s\n(%s)(%s)", info.m_cText, info.m_cComputerName, info.m_cIP);
+				cs.Format("%s\n(%s)(%s)", info.m_cDesc, info.m_cComputerName, info.m_cIP);
 				
 				if(pClip)
 				{
@@ -154,61 +157,49 @@ UINT  ClientThread(LPVOID pParam)
 				if(g_Opt.m_csIPListToPutOnClipboard.Find(info.m_cComputerName) >= 0)
 					bSetToClipBoard = TRUE;
 				
-				info.m_cText[20] = 0;
-				LogSendRecieveInfo(StrF("::START %s %s %s", info.m_cText, info.m_cComputerName, info.m_cIP));
+				info.m_cDesc[20] = 0;
+				LogSendRecieveInfo(StrF("::START %s %s %s", info.m_cDesc, info.m_cComputerName, info.m_cIP));
 			}
 			break;
 		case MyEnums::DATA_START:
 			{
-				if(pByte != NULL)
-				{
-					delete pByte;
-					pByte = NULL;
-				}
-				
-				lByteSize = info.m_lParameter1;
-				pByte = new BYTE[info.m_lParameter1];
+				LogSendRecieveInfo("::DATA_START -- START");
+				cf.m_hgData = NewGlobal(info.m_lParameter1);
+				cf.m_cfType = GetFormatID(info.m_cDesc);
+
+				LogSendRecieveInfo(StrF("::--------DATA_START Total Size = %d type = %s", info.m_lParameter1, info.m_cDesc));
 
-				cf.m_cfType = GetFormatID(info.m_cText);
-				lBytesCopied = 0;
 				if(pClip)
 					pClip->m_lTotalCopySize += info.m_lParameter1;
 
-				LogSendRecieveInfo(StrF("::DATA_START Total Size = %d type = %s", lByteSize, info.m_cText));
-			}
-			break;
-		case MyEnums::DATA:
-			{
-				memcpy(((char*)pByte) + lBytesCopied, info.m_cText, info.m_lParameter1);
-				lBytesCopied += info.m_lParameter1;
+				LogSendRecieveInfo("::--------Before RecieveExactSize");
+				LPVOID pvData = GlobalLock(cf.m_hgData);
+				
+				//Recieve the clip data
+				if(RecieveExactSize(socket, (char*)pvData, info.m_lParameter1) == FALSE)
+					bBreak = true;
+
+				GlobalUnlock(cf.m_hgData);
+				LogSendRecieveInfo("::--------After RecieveExactSize");
 
-				LogSendRecieveInfo(StrF("::DATA Copy Bytes = %d TotalCopy = %d", info.m_lParameter1, lBytesCopied));
+				LogSendRecieveInfo("::DATA_START -- END");
 			}
 			break;
 		case MyEnums::DATA_END:
 			{
-				if(pByte)
+				LogSendRecieveInfo("::DATA_END");
+				
+				if(pClip)
 				{
-					cf.m_hgData = NewGlobalP(pByte, lByteSize);
-
-					if(pClip)
-					{
-						pClip->m_Formats.Add(cf);
-						cf.m_hgData = 0; // now owned by pClip
-					}
-
-					delete pByte;
-					pByte = NULL;
+					pClip->m_Formats.Add(cf);
+					cf.m_hgData = 0; // now owned by pClip
 				}
-				else
-					LogSendRecieveInfo("::ERROR pByte was null");
-
-
-				LogSendRecieveInfo("::DATA_END");
 			}
 			break;
 		case MyEnums::END:
 			{				
+				LogSendRecieveInfo("::END");
+
 				if(pClipList == NULL)
 					pClipList = new CClipList;
 
@@ -219,15 +210,16 @@ UINT  ClientThread(LPVOID pParam)
 				}
 				else
 					LogSendRecieveInfo("::ERROR pClipList was NULL");
-
-				LogSendRecieveInfo("::END");
-
 			}
 			break;
 		case MyEnums::EXIT:
 			{				
+				LogSendRecieveInfo("::EXIT");
+
 				if(pClipList && pClipList->GetCount() > 0)
 				{
+					theApp.m_lClipsRecieved += pClipList->GetCount();
+
 					//Post a message pClipList will be freed by the reciever
 					::PostMessage(theApp.m_MainhWnd, WM_ADD_TO_DATABASE_FROM_SOCKET, (WPARAM)pClipList, bSetToClipBoard);
 					pClipList = NULL;
@@ -235,7 +227,6 @@ UINT  ClientThread(LPVOID pParam)
 				else
 					LogSendRecieveInfo("::ERROR pClipList was NULL or Count was 0");
 
-				LogSendRecieveInfo("::EXIT");
 				bBreak = true;
 			}
 			break;

+ 9 - 11
Server.h

@@ -17,27 +17,25 @@ public:
 	enum eSendType{START, DATA, DATA_START, DATA_END, END, EXIT};
 };
 
-#define MAX_DATA_SIZE	4000
-class SendInfo
+class CSendInfo
 {
 public:
-	SendInfo()
+	CSendInfo()
 	{
-		m_nSize = sizeof(SendInfo);
+		m_nSize = sizeof(CSendInfo);
 		m_nVersion = 1;
-		memset(&m_cExtra, -1, sizeof(m_cExtra));
+		m_lParameter1 = -1;
+		m_lParameter2 = -1;
 	}
 	int					m_nSize;
 	MyEnums::eSendType	m_Type;
 	int					m_nVersion;
-
 	char				m_cIP[20];
 	char				m_cComputerName[MAX_COMPUTERNAME_LENGTH + 1];
-
-	long		m_lParameter1;
-	long		m_lParameter2;
-	char		m_cText[MAX_DATA_SIZE];
-	char		m_cExtra[1000];
+	char				m_cDesc[250];
+	long				m_lParameter1;
+	long				m_lParameter2;
+	char				m_cExtra[50];
 };
 
 UINT  MTServerThread(LPVOID pParam);