#include #include #include #include #include #include #include bool Socket::create(Domain domain,Type type,Protocol protocol) { destroy(); if(!isInitialized())return isOkay(); mSocket=::socket((int)domain,(int)type,(int)protocol); mReceiveCache.socket(mSocket); mDisposition=CloseSocket; return isOkay(); } void Socket::destroy(void) { if(!isOkay()||!isInitialized())return; if(CloseSocket==mDisposition)::closesocket(mSocket); mSocket=INVALID_SOCKET; isConnected(FALSE); isBound(FALSE); isListening(FALSE); } Socket &Socket::operator=(const Socket &someSocket) { destroy(); mSocket=someSocket.mSocket; mReceiveCache.socket(mSocket); mDisposition=AssumedSocket; isConnected(someSocket.isConnected()); isBound(someSocket.isBound()); isListening(someSocket.isListening()); return *this; } Socket &Socket::operator=(SOCKET someSOCKET) { destroy(); mSocket=someSOCKET; mReceiveCache.socket(mSocket); mDisposition=CloseSocket; isConnected(FALSE); isBound(FALSE); isListening(FALSE); return *this; } DWORD Socket::receive(char *buffer,DWORD count,bool waitForData) { DWORD cbytes(0); for(;cbytes &receiveStrings) { String stringData; String seriesItem; receiveStrings.remove(); while(TRUE) { if(!receive(stringData))break; if(!receiveStrings.size())seriesItem=stringData.substr(0,2); receiveStrings.insert(&stringData); if(!(stringData.operator[](3)=='-'&&stringData.substr(0,2)==seriesItem))break; if(!isConnected())break; } return true; } bool Socket::receiveFrom(void *pBuffer,int buflen,DWORD msgType,INETSocketAddress &from) { int fromLength(sizeof(sockaddr_in)); if(!isOkay()||!pBuffer||buflen<=0)return false; return !(-1==::recvfrom(mSocket,(char*)pBuffer,buflen,msgType,(sockaddr*)&(from.getsockaddr()),&fromLength)); } bool Socket::receivePage(Block &receiveStrings) { String stringData; receiveStrings.remove(); while(TRUE) { if(!receive(stringData))break; receiveStrings.insert(&stringData); if(stringData.substr(0,6)==String("")||stringData.substr(0,6)==String(""))break; else if(stringData.substr(0,13)==String("")||stringData.substr(0,13)==String(""))break; } return true; } bool Socket::receiveHeader(Block &headerLines) { String stringData; headerLines.remove(); while(true) { if(!receive(stringData))break; if(stringData.isNull())break; stringData.lower(); headerLines.insert(&stringData); } return true; } bool Socket::receiveImage(String pathFileName,TimeInfo &someTimeInfo) { String strDirectory(pathFileName); DiskInfo diskInfo; Profile iniProfile; char rcvChar[BlockLength]; DWORD bufferLength; DWORD receiveCount(0); Block headerLines; DWORD sizeData(0); if(!isConnected())return false; if(diskInfo.getDiskFreeSpace()sizeData)bufferLength=sizeData-receiveCount; else bufferLength=sizeof(rcvChar); while(!mReceiveCache.isReady(FALSE)); mReceiveCache.receive(rcvChar,bufferLength,bufferLength); if(!bufferLength)continue; writeFile.write((unsigned char*)rcvChar,bufferLength); receiveCount+=bufferLength; if(!isConnected())break; } someTimeInfo.endTime(sizeData); writeFile.close(); return true; } bool Socket::receiveBinary(String pathFileName,DWORD sizeData,TimeInfo &someTimeInfo) { String strDirectory(pathFileName); DiskInfo diskInfo; Profile iniProfile; char rcvChar[BlockLength]; DWORD bufferLength; DWORD receiveCount(0); if(!isConnected())return false; if(diskInfo.getDiskFreeSpace()sizeData)bufferLength=sizeData-receiveCount; else bufferLength=sizeof(rcvChar); while(!mReceiveCache.isReady(FALSE)); if(!mReceiveCache.receive(rcvChar,sizeof(rcvChar),bufferLength))break; writeFile.write((unsigned char*)rcvChar,bufferLength); receiveCount+=bufferLength; if(!isConnected())break; } someTimeInfo.endTime(sizeData); return false; } bool Socket::receiveBinary(String pathFileName,TimeInfo &someTimeInfo) { Profile iniProfile; char rcvChar[BlockLength]; DWORD bufferLength(sizeof(rcvChar)); DWORD receiveCount(0); if(!isConnected())return false; iniProfile.makeFileName(pathFileName); if(pathFileName.isNull())return false; FileHandle writeFile(pathFileName,FileHandle::Write,FileHandle::ShareRead,FileHandle::Overwrite); someTimeInfo.startTime(); while(true) { while(!mReceiveCache.isReady(false)); if(!mReceiveCache.receive(rcvChar,sizeof(rcvChar),bufferLength))break; writeFile.write((unsigned char*)rcvChar,bufferLength); receiveCount+=bufferLength; if(!isConnected())break; } someTimeInfo.endTime(receiveCount); return true; } bool Socket::send(const char *buffer,DWORD count) { if(!isConnected())return false; if(!count)return false; canWrite(); if(SOCKET_ERROR==::send(mSocket,buffer,count,0))return false; return true; } bool Socket::send(const char &charData) { if(!isConnected())return false; canWrite(); if(SOCKET_ERROR==::send(mSocket,&((char&)charData),sizeof(charData),0))return false; return true; } bool Socket::send(Block &strings) { for(int index=0;index