Добавил:
Kaz
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <string>
#include <fstream>
#include <ctime>
#include "md5.h"
#pragma comment (lib, "ws2_32")
#pragma comment (lib,"md5.lib")
#define MAX_CONNECTION_COUNT 2
#define MESSAGE_LENGTH 1024 * 4
#define IP "192.168.1.2"
#define PORT 10001
using namespace std;
long sended = 0;
struct sockaddr_in server;
struct sockaddr_in client;
void Initialization()
{
WSADATA WsaDat;
if (WSAStartup(MAKEWORD(1, 1), &WsaDat) != 0)
printf("WSA Initialization failed. Error code: %d", WSAGetLastError());
}
SOCKET CreateSocket()
{
SOCKET sock;
if (INVALID_SOCKET == (sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) )
{
printf("Create socket error. Error code: %d", WSAGetLastError());
return NULL;
}
else return sock;
}
void BindSocket(SOCKET sock)
{
ZeroMemory (&server, sizeof (server));
server.sin_family = AF_INET;
server.sin_addr.S_un.S_addr = inet_addr (IP);
server.sin_port = htons(PORT);
if (SOCKET_ERROR == bind (sock, (sockaddr* ) &server, sizeof (server)))
printf("Bind socket error. Error code: %d", WSAGetLastError());
}
bool SendData(SOCKET clientSocket,char* serverMessage)
{
int t = strlen(serverMessage);
if(sendto(clientSocket, serverMessage, strlen(serverMessage), 0,
(struct sockaddr *)&client, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
closesocket(clientSocket);
return false;
}
return true;
}
int GetFileInfo(SOCKET Socket, string fileName)
{
std::ifstream file(fileName, ios::in | ios::binary);
if (!file.is_open())
{
SendData(Socket, "404 FILE NOT FOUND\r\n\0");
return 4;
}
file.seekg (0, ios::end);
long readed = file.tellg();
file.close();
char tmp[256];
SendData(Socket, (char*)string(ltoa(readed,tmp,10)).c_str());
return 0;
}
int GetFileData(SOCKET sock, string fileName, long position)
{
std::ifstream file(fileName, ios::in | ios::binary);
if (!file.is_open())
{
SendData(sock, "404 FILE NOT FOUND\r\n\0");
return 4;
}
char memblock[MESSAGE_LENGTH+1];
file.seekg (position, ios::beg);
file.read (memblock, MESSAGE_LENGTH);
long readed = file.gcount();
file.close();
if(readed > 0)
{
char tmp[MESSAGE_LENGTH+33];
char *tmp2 =strdup(MD5(string(memblock, readed)).hexdigest().c_str());
for (int i = 0; i < 32; i++)
{
tmp[i] = tmp2[i];
}
for(int i = 32; i < readed + 32; i++)
{
tmp[i] = memblock[i-32];
}
readed += 32;
tmp[readed] = '\0';
if(sendto(sock, tmp, readed, 0,
(struct sockaddr *)&client, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
{
closesocket(sock);
return 1;
}
sended += readed;
return 0;
}
else
{
if(position == 0)
{
SendData(sock, "404 FILE NOT FOUND\r\n\0");
return 4;
}
SendData(sock, "102 ALL SENDED\r\n\0");
return 1;
}
return 0;
}
int ParseRequest(SOCKET Socket, string message)
{
if(message.length() < 1)
{
return 4;
}
string request[3] = {"","",""};
int index1 = 0, index2 = 0, i = 0;
while(1)
{
index2 = message.find("\n\r", index2);
if(index2 > 0 && index2 < message.length())
{
request[i] = message.substr(index1 ,index2 - index1);
index2 += 2;
index1 = index2;
i++;
if(i == 3) break;
}
else break;
}
if(request[0].compare("GET") == 0)
{
long position = atol(request[2].c_str());
return GetFileData(Socket,request[1], position);
}
if(request[0].compare("INFO") == 0)
{
return GetFileInfo(Socket, request[1]);
}
else
{
SendData(Socket, "403 WRONG REQUEST\r\n\0");
return 4;
}
return 0;
}
string ReceiveData(SOCKET Socket)
{
char* tmpMessage = new char[MESSAGE_LENGTH];
int messageLength;
int addrLen = (int)sizeof(struct sockaddr_in);
if ((messageLength = recvfrom(Socket, tmpMessage, MESSAGE_LENGTH, 0,
(struct sockaddr *)&client, &addrLen)) == -1 )
{
printf("Recive message error. Error code: %d\n", WSAGetLastError());
return string();
}
string response(tmpMessage,messageLength);
delete []tmpMessage;
return response;
}
int main(int argc, char *argv[])
{
do
{
Initialization();
SOCKET Socket = CreateSocket();
if(Socket != NULL)
{
BindSocket(Socket);
sended = 0;
while(ParseRequest(Socket, ReceiveData(Socket)) == 0);
closesocket (Socket);
}
else closesocket (Socket);
WSACleanup();
}while(1);
return 0;
}