📄 comm.cpp
字号:
#include "Comm.h"
WSADATA wsaData;
SOCKET m_socket;
SOCKET m_backup;
sockaddr_in con;
SOCKET AcceptSocket;
//构造函数
WComm::WComm()
{
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET )
{
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}
m_backup = m_socket;
}
//启动服务器函数
int WComm::startServer(int port)
{
con.sin_family = AF_INET;
con.sin_addr.s_addr = inet_addr( "0.0.0.0" );
con.sin_port = htons( port );
if ( bind( m_socket, (SOCKADDR*) &con, sizeof(con) ) == SOCKET_ERROR)
{
//printf( "Failed to bind.\n" );
WSACleanup();
return 0;
}
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
{
//printf( "Error listening on socket.\n");
return 0;
}
return 1;
}
//等待连接函数
void WComm::waitForClient()
{
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR )
{
AcceptSocket = accept( m_backup, NULL, NULL );
}
m_socket = AcceptSocket;
}
//断开连接函数
void WComm::closeConnection()
{
closesocket(m_socket);
m_socket = m_backup;
}
//数据发送函数
int WComm::sendData(char *sendbuf)
{
return send( m_socket, sendbuf, strlen(sendbuf), 0 );
}
//数据接收函数
int WComm::recvData(char *recvbuf,int size)
{
int sz = recv( m_socket, recvbuf, size, 0 );
recvbuf[sz] = '\0';
return sz;
}
int WComm::blocksendData(char *sendbuf, int size)
{
return send( m_socket, sendbuf, size, 0 );
}
void WComm::fileReceive(char *f_path)
{
char filename[256]="";
char h_filename[256]="";
char m_filename[10]="";
char l_filename[10]="";
char recfilename[32]="";
HANDLE h;
WIN32_FIND_DATA lpFindFileData ;
int i,j,len,recs;
char rec[32]="";
strcat(filename,f_path);//得到服务器当前路径
recv( m_socket, recfilename, 32, 0 ); //接受客户端发送的文件名称
send( m_socket, "name received OK", strlen("name received OK"), 0 ); //发送反馈信息
strcat(filename,"\\");
strcat(filename,recfilename);//获得要创建的全路径文件名
h=FindFirstFile(filename,&lpFindFileData);//判断是否有重名文件存在
if(h!=INVALID_HANDLE_VALUE)//若存在重名文件
{
len=strlen(filename);
for(i=len;i>=0;i--)
{
if(filename[i]=='.')
break;
}
l_filename[0]=')';
for(j=i;j<=len;j++)
l_filename[j-i+1]=filename[j];
filename[i]='(';
filename[i+1]='\0';
strcpy(h_filename,filename);
for(i=1;i<256;i++)
{
itoa(i,m_filename,10);
strcpy(filename,h_filename);
strcat(filename,m_filename);
strcat(filename,l_filename);
h=FindFirstFile(filename,&lpFindFileData);
if(h==INVALID_HANDLE_VALUE)
break;
}
}
//create a file in server with filename
FILE *fw = fopen(filename, "wb");
//接收文件长度
recs = recv( m_socket, rec, 32, 0 );//!!!!!!!!!!!!!!11
//发送反馈信息
send( m_socket, "size received OK", strlen("size received OK"), 0 );//!!!!!!!!!!!!!
rec[recs]='\0';
int size = atoi(rec);
while(size > 0)
{
char buffer[1030];
if(size>=1024)
{
recv( m_socket, buffer, 1024, 0 );//!!!!!!!!!!!!!!!
send( m_socket, "OK", strlen("OK"), 0 );//!!!!!!!!!!!!!!!!!
fwrite(buffer, 1024, 1, fw);
}
else
{
recv( m_socket, buffer, size, 0 );//!!!!!!!!!!!!!!!!!!!!!!
send( m_socket, "OK", strlen("OK"), 0 );//!!!!!!!!!!!!!!!!!
buffer[size]='\0';
fwrite(buffer, size, 1, fw);
}
size -= 1024;
}
fclose(fw);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -