Server端:
#include "stdafx.h"
#include "NetWork.h"
#include "winsock2.h"
// innitialize socket
bool InitializeSocket()
{
bool bRet = false;
do
{
WSAData wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
break;
if (2 != LOBYTE(wsadata.wVersion) || 2 != HIBYTE(wsadata.wVersion))
break;
bRet = true;
} while (false);
return bRet;
}
sockaddr_in clientAddr;
// BindSocketToPort
int BindSocketToPort()
{
int nRet = -1;
do
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.1.3"); // 0 any ip
nRet = bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR));
if (nRet == SOCKET_ERROR)
break;
nRet = sock;
} while (false);
return nRet;
}
bool StartServer(int socket)
{
int len = sizeof(SOCKADDR);
char buf[1024] = { 0 };
int res = recvfrom(socket, buf, sizeof(buf), 0, (SOCKADDR*)&clientAddr, &len);
printf("First Receiver from client:%s,%d\n", buf, socket);
CreateThread(0, 0, RecvProc, (void*)(&socket), 0, 0);
while (true)
{
char buf[1024] = { 0 };
gets_s(buf, 1024);
sendto(socket, buf, 1024, 0, (SOCKADDR*)&clientAddr, sizeof(SOCKADDR));
}
}
unsigned long __stdcall RecvProc(void* lpParameter)
{
int sock = *(int*)lpParameter;
char*pRecvFileData = nullptr; //file data pointer
long fileSize = 0;
char fileName[256] = { 0 };
int receivedFileLen = 0; // received file len
int realResLen = 0;
FILE* fp = 0;
while (true)
{
char buf[1500] = { 0 };
int res = recvfrom(sock, buf, sizeof(buf), 0, 0, 0);
//printf("recevied from client:%s,%d\n", buf, sock);
int id = *(int*)buf; // ID flag
realResLen = res - sizeof(int) - sizeof(int);
switch (id)
{
// data
case 1:
{
FileData* fd = (FileData*)buf;
printf("received data :%d,%s", fd->index, fd->fileData);
//notice the index of data
memcpy(pRecvFileData+fd->index*1024, fd->fileData, realResLen);
receivedFileLen += realResLen;
}
break;
// header
case 2:
{
memcpy(&fileSize, buf+sizeof(int), sizeof(fileSize));
memset(fileName, 0, 256);
strcpy_s(fileName, buf +sizeof(int)+ sizeof(fileSize));
printf("file Name: %s, file Size: %d\n", fileName, fileSize);
// open file
fopen_s(&fp, fileName, "wb");
// ready to receive data
pRecvFileData = new char[fileSize];
memset(pRecvFileData,0, fileSize);
}
break;
default:
break;
}
printf("receivedFileLen:%d;fileSize:%d", receivedFileLen, fileSize);
// if the file is tranfer finished,you must close the file
if (receivedFileLen==fileSize && receivedFileLen !=0)
{
// write data into file
fwrite(pRecvFileData, receivedFileLen, 1, fp);
fclose(fp);
receivedFileLen = 0;
printf("file received finished!");
}
}
return 0;
}
客户端:
#include "stdafx.h"
#include "NetWork.h"
#include "winsock2.h"
#include "stdio.h"
// innitialize socket
bool InitializeSocket()
{
bool bRet = false;
do
{
WSAData wsadata;
if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
break;
if (2 != LOBYTE(wsadata.wVersion) || 2 != HIBYTE(wsadata.wVersion))
break;
bRet = true;
} while (false);
return bRet;
}
struct FileData
{
int id; // flag 2:fileName or 1:data
int index; // index data
char fileData[1024]; // data
};
char* getFileName(char* filePath)
{
int len = strlen(filePath);
for (int i = len; i >=0; i--)
{
if (filePath[i]=='/'||filePath[i]=='\\')
{
return &filePath[i+1];
}
}
return 0;
}
// Create Socket
int StartTalking(const char* ip, unsigned short port)
{
int nRet = -1;
do
{
SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.S_un.S_addr = inet_addr(ip); // 0 any ip
sendto(sock, "hello", strlen("hello"), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
CreateThread(0, 0,RecvFrom, (void*)&sock, 0, 0);
while (true)
{
char buf[1024] = { 0 };
printf("Please Input File Name for transfer: ");
gets_s(buf);
// Get file size
long size = GetFileLength(buf);
char* realFileName = getFileName(buf);
char sendBuf[1024] = { 0 };
int fileSizeID = 2;
memcpy(sendBuf, &fileSizeID, sizeof(int));
memcpy(&sendBuf[sizeof(int)], &size, sizeof(size));
memcpy(&sendBuf[sizeof(size)+sizeof(int)], realFileName, strlen(realFileName));
printf("file name is:%s\n", realFileName);
// Send
sendto(sock, sendBuf,sizeof(int)+ sizeof(size)+strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR));
// Send data
FILE* pf = 0;
fopen_s(&pf, buf, "rb");
int index = 0;
while (!feof(pf))
{
FileData fd = { 0 };
fd.id = 1; // flag for message
fd.index = index++;
int readsize = fread(fd.fileData, 1, 1024, pf);
printf("read file data :%s\n", fd.fileData);
sendto(sock, (char*)&fd, readsize+sizeof(int)*2, 0, (SOCKADDR*)&addr, sizeof(addr)); // send file data to server
Sleep(10);
}
fclose(pf);
}
nRet = sock;
} while (false);
return nRet;
}
// Get the file Length
long GetFileLength(char* fileName)
{
long lRet = 0;
do
{
FILE *pf = 0;
int errInfo = fopen_s(&pf, fileName, "r+");
if (0 != errInfo)
break;
fseek(pf, 0, SEEK_END);
long size = ftell(pf);
fclose(pf);
lRet = size;
} while (false);
return lRet;
}
unsigned long __stdcall RecvFrom(void* lpParameter)
{
int sock = *(int*)lpParameter;
while (true)
{
char buf[1024] = { 0 };
recvfrom(sock, buf, 1024, 0, 0, 0);
printf("received from server:%s\n", buf);
}
}