#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;
}
Соседние файлы в папке UDPServer
  • #
    15.06.20144.6 Кб45main.cpp
  • #
    15.06.20141.89 Кб46md5.h
  • #
    15.06.20147.14 Кб45MD5.lib
  • #
    15.06.20144.12 Кб45UDPServer.vcxproj
  • #
    15.06.20141.31 Кб45UDPServer.vcxproj.filters
  • #
    15.06.2014143 б46UDPServer.vcxproj.user