please say the tips for socket programming
hi,
i have changed my code like this:
sender:
********
//Method for checking any errors to establish connection
int Sender::SetAddress(void)
{
GetAddress();
//connect to the address specified with the socket and check if any
error
int returnValue=connect(mySocket,(struct sockaddr
*)&serverAddress,sizeof(serverAddress));
if(returnValue== INVALID_SOCKET)
{
returnValue = WSAGetLastError();
cout<<endl<<"Error in Connecting";
CloseSocket();
return 1;
}
else
cout<<endl<<"The connection is ready for communication";
return returnValue;
}
//Method for storing the data in the buffer for sendning
int Sender::GetFileInfo(void)
{
FILE *filePointer;
CString sendFilePath="";
char *fileName,*fileContent,*fileNameLength,*fileSize;
unsigned int bytesRead;
int valueReturn;
fileSize = new char(32);
fileNameLength=new char(32);
CString findFilePath=filePathInformation+"*.*";
bWorking=finder.FindFile(findFilePath);
while (bWorking)
{
bWorking = finder.FindNextFile();
CString findFileName(finder.GetFileName());
if(findFileName.Compare(".") == 0 || findFileName.Compare("..") == 0)
continue;
int returnValue=SetAddress();
switch(returnValue)
{
case 0:
sendFilePath=finder.GetFilePath();
filePointer = fopen(sendFilePath, "rb");
if( filePointer == NULL )
{
cout<<endl<<"File open error";
CloseSocket();
valueReturn=1;
}
else
{
fseek(filePointer, 0, SEEK_END); // Move File Pointer to EOF
sizeOfFile=ftell(filePointer); // Get position of File Pointer
rewind(filePointer); // Move File Pointer back to beginning of
file
fileNameSize=findFileName.GetLength();
char *returnChar=ltoa( sizeOfFile, fileSize,10);
returnChar=itoa(fileNameSize,fileNameLength,10 );
fileName=new char(fileNameSize);
strcpy(fileName,findFileName.GetBuffer(fileNameSize));
fileContent=(char *)calloc(sizeOfFile,sizeof(char));
bytesRead=fread(fileContent,sizeof(char),sizeOfFile,filePointer);
int
valueReturned=SendData(fileSize,fileNameLength,fileName,fileContent);
fclose(filePointer);
CloseSocket();
sendFilePath.Empty();
valueReturn=0;
}
break;
case 1:
cout<<endl<<"Error in connecting";
CloseSocket();
valueReturn=1;
break;
}
if(valueReturn==1)
return valueReturn;
/*delete[] fileSize;
delete[] fileNameLength;
delete[] fileName;
free(fileContent);*/
}
return valueReturn;
}
int Sender::SendData(char *fileSize,char *fileNameLength,char
*fileName,char *fileContent)
{
BOOL flag=FALSE;
int returnValue = send(mySocket,fileSize,32,0);
if(returnValue == SOCKET_ERROR)
{
cout<<endl<<"Error in Sending File Length";
CloseSocket();
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Size Sent Successfully : "<<fileSize;
}
//send file name length
returnValue = send(mySocket,fileNameLength,32,0);
if(returnValue == SOCKET_ERROR)
{
cout<<endl<<"Error in Sending File Details";
CloseSocket();
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Length Sent Successfully : "<<fileNameSize;
}
//Send the file name
returnValue = send(mySocket,fileName,fileNameSize,0);
if(returnValue == SOCKET_ERROR)
{
cout<<endl<<"Error in Sending in File Name";
CloseSocket();
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Name Sent Successfully : "<<fileName;
}
//sending the file
returnValue = send(mySocket,fileContent,sizeOfFile,0);
if(returnValue == SOCKET_ERROR)
{
cout<<endl<<"Error in Sending File Contents";
CloseSocket();
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Sent Successfully "<< returnValue<<" bytes";
}
CloseSocket();
ERRORLABEL:
if(flag==TRUE)
return 0;
else
return 1;
}
void Sender::GetAddress()
{
//Creating connection to the socket
WSADATA wsadata;
int r = WSAStartup(MAKEWORD(2,0) , &wsadata);
//CREATE SOCKET
mySocket = socket (AF_INET, SOCK_STREAM,0);
if(mySocket == INVALID_SOCKET)
cout<<endl<<"CANNOT OPEN SOCKET TO COMMUNICATE";
//Select the address and file details from .ini file
serverAddress.sin_family = AF_INET;
//Getting the port details from the ini file
CString
port=iniFileReader.getKeyValue("PortNumber","ADDRESS_INFORMATION");
portNumber=atoi(port);
// storing the Address information in the structure
serverAddress.sin_port = htons(atoi(port));
CString IPAddress;
IPAddress=iniFileReader.getKeyValue("IPAddress","ADDRESS_INFORMATION");
char *address;
int IPAddressLength=IPAddress.GetLength();
address=IPAddress.GetBuffer(IPAddressLength);
serverAddress.sin_addr.S_un.S_addr=inet_addr(address);
}
void Sender::SetIniFileInfo(void)
{
char filePath[_MAX_PATH] = "";
char * ModuleName = NULL;
HMODULE ModuleHandle = NULL;
ModuleName = "Receiver.exe";
ModuleHandle = GetModuleHandle(ModuleName);
// Retrieve the path of the EXE.
long valueReturned=::GetModuleFileName(ModuleHandle, filePath,
sizeof(filePath));
char *tempString=strrchr(filePath, '\\' );
if(tempString!=NULL)
*tempString='\0';
iniFilePath=filePath;
iniFilePath+="\\SenderConfig.ini";
iniFileReader.setINIFileName(iniFilePath);
filePathInformation=iniFileReader.getKeyValue("SendFolderPath","FILE_INFORMATION");
}
void Sender::CloseSocket(void)
{
//CLOSE SOCKET AND EXIT
closesocket(mySocket);
WSACleanup();
}
int main(int argc, char* argv[])
{
Sender *senderObject=new Sender;
senderObject->SetIniFileInfo();
senderObject->GetAddress();
int returnValue=senderObject->GetFileInfo();
if(returnValue==0)
cout<<endl<<"File Infromation retreived succesfully";
//delete senderObject;
return 0;
}
Receiver:
**********
void Receiver::GetAddress(void)
{
WSADATA wsadata;
int r = WSAStartup(MAKEWORD(2,0) , &wsadata);
//CREATE SOCKET
mySocket = socket (AF_INET, SOCK_STREAM,0);
if(mySocket == INVALID_SOCKET)
cout<<endl<<"CANNOT OPEN SOCKET TO COMMUNICATE";
char filePath[_MAX_PATH];
char * ModuleName = NULL;
HMODULE ModuleHandle = NULL;
ModuleName = "Receiver.exe";
ModuleHandle = GetModuleHandle(ModuleName);
// Retrieve the path to the EXE.
long valueReturned=::GetModuleFileName(ModuleHandle, filePath,
sizeof(filePath));
char *tempString=strrchr(filePath,'\\' );
if(tempString!=NULL)
*tempString='\0';
iniFilePath=filePath;
iniFilePath+="\\";
iniFilePath+="ReceiverConfig.ini";
//cout<<endl<<iniFilePath;
iniReader.setINIFileName(iniFilePath);
//assign input values to the address structure
serverAddress.sin_family = AF_INET;
CString
port=iniReader.getKeyValue("PortNumber","ADDRESS_INFORMATION");
portNumber=atoi(port);
// storing the Address information in the structure
serverAddress.sin_port = htons(atoi(port));
CString IPAddress;
IPAddress=iniReader.getKeyValue("IPAddress","ADDRESS_INFORMATION");
char *address;
int IPAddressLength=IPAddress.GetLength();
address=IPAddress.GetBuffer(IPAddressLength);
serverAddress.sin_addr.S_un.S_addr=inet_addr(address);
filePathInformation=iniReader.getKeyValue("SaveFolderPath","FILE_INFORMATION");
}
int Receiver::SetAddress(void)
{
int returnValue;
GetAddress();
//check the port number is valid and if it is blocked
if(portNumber<=65535 && portNumber>=1024)
{
returnValue = bind (mySocket, (struct sockaddr *)&serverAddress,
sizeof(serverAddress));
if (returnValue==SOCKET_ERROR)
{
returnValue = GetLastError();
cout<<endl<<" Cannot bind to the port";
return 1;
}
if((returnValue=listen(mySocket,10))== 0 )
{
}
else
{
cout<<endl<<"Error: Port is not Ready for listening";
return 1;
}
}
else
{
cout<<endl<<"Invalid Port";
return 1;
}
int serverAddrInfoSize=sizeof(serverAddress);
mySocket= accept(mySocket,(struct sockaddr
*)&serverAddress,&serverAddrInfoSize );
if(mySocket==INVALID_SOCKET)
{
CloseSocket();
return 1;
}
return returnValue;
}
void Receiver::ReceiveData(void)
{
int returnValue=-1;
int fileNameLength;
BOOL flag=FALSE;
CString filePath;
long fileSize;
char
*fileContentBuffer,*fileNameBuffer,*fileSizeBuffer,*fileNameSizeBuffer;
fileSizeBuffer=(char *)calloc(32,sizeof(long));
fileNameSizeBuffer=(char *)calloc(32,sizeof(int));
do{
int valueReturned=SetAddress();
switch(valueReturned)
{
case 0:
filePath=filePathInformation;
//Buffer to store the file size
returnValue=recv(mySocket,fileSizeBuffer,32,0);
if(returnValue== SOCKET_ERROR)
{
cout<<endl<<"Error in receiving Data";
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Size Received : ";
}
//long valueReturned=_CrtSetBreakAlloc(allocReqNum);
fileSize=atol(fileSizeBuffer);
cout<<fileSize;
//Buffer to store the file name size
returnValue=recv(mySocket,fileNameSizeBuffer,32,0);
if(returnValue== SOCKET_ERROR)
{
cout<<endl<<"Error in receiving Data";
flag=FALSE;
goto ERRORLABEL;
}
else
{
flag=TRUE;
cout<<endl<<"File Length Received : ";
}
//value=_getch();
fileNameLength=atoi(fileNameSizeBuffer);
cout<<fileNameLength;
//allocate memory for the buffer to store the file name received
fileNameBuffer =new char(fileNameLength);
returnValue=recv(mySocket,fileNameBuffer, fileNameLength,0);
//save the file name
if(returnValue != SOCKET_ERROR)
{
filePath+=fileNameBuffer;
cout<<endl<<"File Name Received successfully : "<<fileNameBuffer;
}
else
{
cout<<endl<<"Error in Receiving File Name";
flag=FALSE;
goto ERRORLABEL;
}
//value=_getch();
//allocate memory for the buffer to store the file contents received
fileContentBuffer =(char *)calloc(fileSize,sizeof(char));
returnValue=recv(mySocket,fileContentBuffer, fileSize,0);
if(returnValue != SOCKET_ERROR)
{
int filePathLength=filePath.GetLength();
char *filePathBuffer=filePath.GetBuffer(filePathLength);
int
retValue=WriteFileContents(fileSize,filePathBuffer,fileContentBuffer);
}
//check there is any error in receiving
else
{
cout<<endl<<"Error in Recieving File Contents";
flag=FALSE;
goto ERRORLABEL;
}
//delete fileContentBuffer;
//returnedValue=_CrtDumpMemoryLeaks();
filePath.Empty();
break;
case 1:
cout<<endl<<"Error in connecting";
flag=FALSE;
goto ERRORLABEL;
break;
}
ERRORLABEL:
if(flag=FALSE)
{
CloseSocket();
return;
}
CloseSocket();
/*free(fileContentBuffer);
delete[] fileNameBuffer;
delete[] fileSizeBuffer;
delete[] fileNameSizeBuffer;*/
}while(returnValue!=-1);
}
int Receiver::WriteFileContents(long fileSize,char *fileName,char
*fileContent)
{
FILE *filePointer=fopen(fileName,"wb");
if( filePointer == NULL )
{
cout<<endl<<"File open error";
CloseSocket();
return 0;
}
else
{
int bytesWrote=fwrite(fileContent,sizeof(char),fileSize,filePointer);
cout<<endl<<"File Received successfully "<<bytesWrote<<" bytes";
fclose(filePointer);
}
return 1;
}
void Receiver::CloseSocket(void)
{
//CLOSE SOCKET AND EXIT
filePathInformation.Empty();
closesocket(mySocket);
WSACleanup();
}
int main(int argc, char* argv[])
{
cout<<"test"<<endl;
Receiver *receiverObject=new Receiver;
receiverObject->ReceiveData();
delete receiverObject;
return 0;
}
seeing this please say the method to do this,
sirisha.