// FileServer.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#pragma comment (lib,"ws2_32.lib")
SOCKET server,newconnection;
FILE *fp,*fcapa;
char filename[1024];
int sizefile,count,ret;
bool isFirst = TRUE;
char tmp[6];
DWORD WINAPI SendThread(LPVOID lpParameter)
{
char buf[100] = "OK ";
char temp[100];
if((fopen_s(&fp,filename,"r"))!= 0)
printf("File %s is not found.",filename);
fopen_s(&fcapa,filename,"r");
fseek(fcapa,0L,SEEK_END);
sizefile = ftell(fcapa) - 1; //Lay kich thuoc file
strcat(buf,filename);
strcat(buf,"\n");
strcat(buf,"Size:");
strcat(buf,_itoa(sizefile,tmp,10));
strcat(buf,"\n\n");
while(!feof(fp))
{
count = fread(temp,sizeof(char),4,fp);//doc tu con trỏ file ra buffer
if(count != 0)
{
temp[count] = 0;
if(isFirst)
{
strcat(buf,temp);
ret = send(newconnection,buf,strlen(buf),0);
}
else
ret = send(newconnection,temp,strlen(temp),0);
if(ret == 0)
printf("Ham send() trong luong phu bi loi %d",WSAGetLastError());
isFirst = FALSE;
}
}
fclose(fp);
fclose(fcapa);
return 0;
}
int _tmain(int argc, _TCHAR* argv[]){
SOCKADDR_IN serverAddr,clientAddr;
int size = sizeof(clientAddr);
WSAData wsaData;
char buf[1024];
int ret,i;
argv[1] = "8888";
WSAStartup(MAKEWORD(2,2),&wsaData);
server = socket(AF_INET,SOCK_STREAM,0);
if(server == INVALID_SOCKET)
printf("Ham socket() loi %d",WSAGetLastError());
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888);
serverAddr.sin_addr.s_addr = htonl(0);
ret = bind(server,(sockaddr*)&serverAddr,sizeof(serverAddr));
if(ret != 0)
printf("Ham bind() loi %d\n",WSAGetLastError());
ret = listen(server,10);
if(ret != 0)
printf("Ham listen() loi %d\n",WSAGetLastError());
newconnection = accept(server,(sockaddr*)&clientAddr,&size);
if(newconnection == INVALID_SOCKET)
printf("Ham accept() loi %d\n",WSAGetLastError());
while(1)
{
ret = recv(newconnection,buf,strlen(buf),0);
if(ret > 0)
{
buf[ret] = 0;
int len = strlen(buf);
if(strncmp(buf,"GET",3) == 0)
{
//Lay ten file
for(i = 0; i < len - 5; i++)
filename[i] = buf[i + 4];
filename[i] = 0;
//Goi luong gui
ret = (int)CreateThread(0,0,SendThread,0,0,0);
}
else
{
memset(buf,0,sizeof(buf));
strcpy(buf,"Unknown Command");
ret = send(newconnection,buf,strlen(buf),0);
if(ret == 0)
printf("Ham send() bi loi: %d",WSAGetLastError());
}
}
}
closesocket(newconnection);
closesocket(server);
WSACleanup();
_getch();
return 0;
}