一、服务端代码:MyServer.cpp
#include "stdafx.h"
#include <iostream>
using namespace std;
#include<stdlib.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define g_MaxConnect 20
int g_Connect = 0;
struct sock_params
{
SOCKET hsock;
int nSockIndex;
};
DWORD WINAPI threadpro(LPVOID pParam)
{
sock_params* sockPam = (sock_params*)pParam;
SOCKET hsock = sockPam->hsock;
int nSockIndex = sockPam->nSockIndex;
char aIndex[4];
_itoa_s(nSockIndex, aIndex, 10);
char buffer[1024];
char sendBuffer[1024];
if(hsock != INVALID_SOCKET)
{
cout<<"客户端 "<< nSockIndex << " 加入服务器!" <<endl;
}
int nRecvBufLen = 1024* 1024;
int nStaus = setsockopt(hsock ,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBufLen,sizeof(int));
if (nStaus == SOCKET_ERROR)
{
hcDebugLog(_T("ZLY:设定接收缓冲区大小失败!"));
}
int nSendBufLen = 1024* 1024;
nStaus = setsockopt(hsock ,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBufLen,sizeof(int));
if (nStaus == SOCKET_ERROR)
{
hcDebugLog(_T("ZLY:设定发送缓冲区大小失败!"));
}
int nErrorNum = 0;
while (1)
{
FileName fn;
memset(&fn, 0, sizeof(FileName));
int nRecvSize = recv(clientSocket, (char*)&fn, sizeof(fn), 0);
if (sizeof(fn) != nRecvSize)
{
if (nRecvSize != 0 && nErrorNum <= MAX_ERROR_NUM)
{
printf("接收文件名称失败!错误码:%d\n", WSAGetLastError());
nErrorNum++;
continue;
}
else
{
break;
}
}
char chPath[_MAX_PATH];
memset(chPath, 0, sizeof(char)*_MAX_PATH);
strcpy_s(chPath, sizeof(chPath), fn.serverDir);
int len = strlen(chPath);
if (chPath[len - 1] != '\\')
{
chPath[len] = '\\';
len++;
}
strcat_s(chPath, fn.dir);
len = strlen(chPath);
if (chPath[len - 1] != '\\')
{
chPath[len] = '\\';
len++;
}
g_lock.Lock();
CreateDir(chPath);
g_lock.UnLock();
strcat_s(chPath, fn.Fname);
FILE* fp = NULL;
errno_t err = fopen_s(&fp, chPath, "wb");
if (err != 0)
{
printf("创建文件失败:%s, 错误码:%d\n", chPath, GetLastError());
continue;
}
long long nSize;
nRecvSize = recv(clientSocket, (char*)&nSize, sizeof(nSize), 0);
if (sizeof(nSize) != nRecvSize)
{
if (fp)
{
fclose(fp);
fp = NULL;
}
if (nRecvSize != 0 && nErrorNum <= MAX_ERROR_NUM)
{
printf("接收文件长度失败!错误码:%d\n", WSAGetLastError());
nErrorNum++;
continue;
}
else
{
break;
}
}
int num;
char buff[MAX_PACK_SIZE];
while (nSize > 0)
{
if (nSize >= MAX_PACK_SIZE)
{
num = recv(clientSocket, buff, MAX_PACK_SIZE, 0);
}
else
{
num = recv(clientSocket, buff, nSize, 0);
}
fwrite(buff, (int)num, 1, fp);
nSize -= num;
memset(buff, 0, sizeof(char)*MAX_PACK_SIZE);
}
if (fp)
{
fclose(fp);
fp = NULL;
}
int nRecvStatus = 0;
send(clientSocket, (char*)&nRecvStatus, sizeof(int), 0);
}
return 0;
}
void main()
{
WSADATA wsd;
WSAStartup(MAKEWORD(2,2),&wsd);
SOCKET m_SockServer;
sockaddr_in serveraddr;
sockaddr_in serveraddrfrom;
SOCKET m_Server[g_MaxConnect];
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(4600);
serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
m_SockServer = socket(AF_INET,SOCK_STREAM,0);
int nStatus = bind(m_SockServer,(sockaddr*)&serveraddr,sizeof(serveraddr));
if (nStatus == 0)
{
cout << "服务端启动成功!" <<endl;
}
else
{
cout << "服务端启动失败!" <<endl;
return;
}
int iLisRet = 0;
int len = sizeof(sockaddr);
while(1)
{
iLisRet = listen(m_SockServer,0);
m_Server[g_Connect] = accept(m_SockServer,(sockaddr*)&serveraddrfrom,&len);
if(m_Server[g_Connect] != INVALID_SOCKET)
{
if(g_Connect > g_MaxConnect-1)
{
char WarnBuf[50]="客户端连接个数:超限!";
int ires = send(m_Server[g_Connect],WarnBuf,sizeof(WarnBuf),0);
}
else
{
char cIndex[4];
_itoa_s(g_Connect, cIndex, 10);
char buf[50]="你的服务端ID: ";
strcat_s(buf, cIndex);
int ires = send(m_Server[g_Connect],buf,sizeof(buf),0);
HANDLE m_Handel;
DWORD nThreadId=0;
sock_params sockPam;
sockPam.hsock = m_Server[g_Connect];
sockPam.nSockIndex = g_Connect;
m_Handel = (HANDLE)::CreateThread(NULL,0,threadpro,&sockPam,0,&nThreadId);
CloseHandle(m_Handel);
}
++g_Connect;
}
}
WSACleanup();
}
二、客户端:MyClient.cpp
#include "stdafx.h"
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<stdio.h>
#include"winsock2.h"
#include<time.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsd;
WSAStartup(MAKEWORD(2,2),&wsd);
SOCKET m_SockClient;
sockaddr_in clientaddr;
clientaddr.sin_family = AF_INET;
clientaddr.sin_port = htons(4600);
clientaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
m_SockClient = socket(AF_INET,SOCK_STREAM,0);
if (m_SockClient == INVALID_SOCKET)
{
printf("Sock 初始化失败: %d\n", WSAGetLastError());
WSACleanup();
return ;
}
{
int optlen = 0;
int optval = 0;
optlen = sizeof(optval);
getsockopt(m_SockClient, SOL_SOCKET, SO_SNDBUF, (char*)&optval, &optlen);
printf("send buf len is %d\n",optval);
getsockopt(m_SockClient, SOL_SOCKET, SO_RCVBUF, (char*)&optval, &optlen);
printf("Recv buf len is %d\n",optval);
}
int nRecvBufLen = 1024* 1024;
int nStaus = setsockopt(pSocketData->clientSocket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBufLen,sizeof(int));
if (nStaus == SOCKET_ERROR)
{
hcDebugLog(_T("ZLY:设定接收缓冲区大小失败!"));
}
int nSendBufLen = 1024* 1024;
nStaus = setsockopt(pSocketData->clientSocket,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBufLen,sizeof(int));
if (nStaus == SOCKET_ERROR)
{
hcDebugLog(_T("ZLY:设定发送缓冲区大小失败!"));
}
int nSuccess = connect(m_SockClient,(sockaddr*)&clientaddr,sizeof(clientaddr));
if (nSuccess == 0)
{
cout<<"连接服务器成功!"<<endl;
}
else
{
cout<<"连接服务器失败!"<<endl;
return;
}
char buffer[1024];
char inBuf[1024];
int num = 0;
num = recv(m_SockClient,buffer,1024,0);
if(num > 0)
{
cout << buffer<<endl;
char* pResult = strstr(buffer, "超限");
if (pResult != NULL)
{
cout<<"服务器连接个数超限,不可用!"<<endl;
system("pause");
return;
}
char filename[256];
FILE* m_fp;
errno_t err = fopen_s(&m_fp, filename, "rb");
if (err != 0)
{
strlog.Format(_T("文件“%s”打开失败,错误码:0x%X"), filename, GetLastError());
return -1;
}
if (sizeof(filename) != send(m_sock, &filename, sizeof(filename), 0))
{
strLog.Format(_T("文件“%s”发送文件名称失败,错误码:%d。"), (LPCTSTR)CString(m_fn.Fname), WSAGetLastError());
cout << strLog <<endl;
fclose(m_fp);
m_fp = NULL;
return -1;
}
fseek(m_fp, 0, SEEK_END);
long long nSize = ftell(m_fp);
fseek(m_fp, 0, SEEK_SET);
if (sizeof(nSize) != send(m_sock, (char*)&nSize, sizeof(nSize), 0))
{
printf(_T("发送文件长度失败,错误码:%d。"), WSAGetLastError());
fclose(m_fp);
m_fp = NULL;
return -1;
}
size_t nNum;
while (1)
{
nNum = fread(m_temp, 1, 1024*500, m_fp);
if (nNum == 0)
break;
if (nNum != send(m_sock, m_temp, (int)nNum, 0))
{
strLog.Format(_T("文件“%s”发送文件数据失败,错误码:%d。"), (LPCTSTR)CString(m_fn.Fname), WSAGetLastError());
fclose(m_fp);
m_fp = NULL;
return -1;
}
memset(m_temp, 0, sizeof(char)*1024*500);
}
fclose(m_fp);
m_fp = NULL;
int recv_len = recv(m_SockClient,buffer,1024,0);
if(recv_len>=0)
{
cout<< buffer <<endl;
}
}
}