Code:
#pragma comment( lib, "ws2_32.lib" )
#include <winsock2.h>
#include <stdio.h>
#include <sys/stat.h>
WSADATA wsaData;
SOCKET mySocket;
sockaddr_in con;
SOCKET AcceptSocket;
#define PORT 4370
int GetFileSize(char file[], int *len)
{
struct stat status;
int res;
res = stat (file, &status);
if (res != 0)
{
fprintf(stderr,"stat function not available\n");
return (-1);
}
*len = (int) status.st_size;
return (0);
}
void ServerConnection(char *ip,int port)
{
con.sin_family = AF_INET;
con.sin_addr.s_addr = inet_addr( ip );
con.sin_port = htons( port );
if ( connect( mySocket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
}
int InitializeServer(int port)
{
con.sin_family = AF_INET;
con.sin_addr.s_addr = inet_addr( "0.0.0.0" );
con.sin_port = htons( port );
if ( bind( mySocket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return -1;
}
if ( listen( mySocket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");
return 0;
}
void ListenForClient(void)
{
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( mySocket, NULL, NULL );
}
mySocket = AcceptSocket;
}
int SendData(char *sendbuffer)
{
return send( mySocket, sendbuffer, strlen(sendbuffer), 0 );
}
int ReceiveData(char *receivebuffer,int size)
{
int ret = recv( mySocket, receivebuffer, size, 0 );
receivebuffer[ret] = '\0';
return ret;
}
void CloseConnection(void)
{
closesocket(mySocket);
}
void ReceiveFile(char *filename)
{
int recs, size;
char record[50] = {0};
recv( mySocket, filename, 32, 0 );
send( mySocket, "GOOD", strlen("GOOD"), 0 );
FILE *filereceive = fopen(filename, "wb");
recs = recv( mySocket, record, 32, 0 );
send( mySocket, "GOOD", strlen("GOOD"), 0 );
record[recs]='\0';
size = atoi(record);
while(size > 0)
{
char buffer[1030];
if(size>=1024)
{
recv( mySocket, buffer, 1024, 0 );
send( mySocket, "GOOD", strlen("GOOD"), 0 );
fwrite(buffer, 1024, 1, filereceive);
}
else
{
recv( mySocket, buffer, size, 0 );
send( mySocket, "GOOD", strlen("GOOD"), 0 );
buffer[size]='\0';
fwrite(buffer, size, 1, filereceive);
}
size -= 1024;
}
fclose(filereceive);
}
void TransmitFile(char *filepath)
{
char filename[50] = {0};
char filesize[10] = {0};
char rec[32] = {0};
char buffer[1030] = {0};
int size, i, j;
i =strlen(filepath);
for(;i>0;i--)if(filepath[i-1]=='\\')break;
for(j=0;i<=(int)strlen(filepath);i++)filename[j++]=filepath[i];
if(GetFileSize(filepath, &size ) == -1)
return;
itoa(size,filesize,10);
send( mySocket, filename, strlen(filename), 0 );
recv( mySocket, rec, 32, 0 );
send( mySocket, filesize, strlen(filesize), 0 );
recv( mySocket, rec, 32, 0 );
FILE *fr = fopen(filepath, "rb");
while(size > 0)
{
if(size>=1024)
{
fread(buffer, 1024, 1, fr);
send( mySocket, buffer, 1024, 0 );
recv( mySocket, rec, 32, 0 );
}
else
{
fread(buffer, size, 1, fr);
buffer[size]='\0';
send( mySocket, buffer, size, 0 );
recv( mySocket, rec, 32, 0 );
}
size -= 1024;
}
fclose(fr);
}
void Server(void)
{
char fname[32] = {0};
char rec[50] = {0};
if(InitializeServer(PORT) == -1)
{
printf("Server initialization failed\n");
return;
}
while (TRUE) {
ListenForClient();
while(TRUE)
{
ReceiveData(rec,32);
SendData("GOOD");
if(strcmp(rec,"TransmitFile")==0)
{
ReceiveFile(fname);
}
if(strcmp(rec,"TerminateConnection")==0)break;
}
CloseConnection();
}
}
void Client(char *ip, char *filepath)
{
char rec[32] = {0};
ServerConnection(ip,PORT);
SendData("TransmitFile");
ReceiveData(rec,32);
TransmitFile(filepath);
SendData("TerminateConnection");
ReceiveData(rec,32);
}
int main(int argc, char *argv[])
{
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("WSAStartup() error\n");
mySocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( mySocket == INVALID_SOCKET ) {
printf( "socket() error: %ld\n", WSAGetLastError() );
WSACleanup();
return -1;
}
if(argc == 1)
Server();
else Client(argv[1],argv[2]);
return 0;
}