MFC Socket简单服务器与客户端源码

时间:2021-06-06 23:58:58

服务器端代码:

#include
"stdafx.h"
#include
"MTServer.h"
SOCKET
server;
using namespace std; UINT  MTServerThread(LPVOID pParam); UINT  ClientThread(LPVOID pParam); BOOL ParseCmd(char *str, CString& cmd, CString& params); BOOL SendFile(SOCKET s, CString fname); int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {     int nRetCode = 0;      cout << "Press ESCAPE to terminate program\r\n";     AfxBeginThread(MTServerThread,0);     while(_getch()!=27);     closesocket(server);     WSACleanup();     return nRetCode; } UINT  MTServerThread(LPVOID pParam) {          WSADATA wsaData;     sockaddr_in local;     int wsaret=WSAStartup(0x101,&wsaData);     if(wsaret!=0)     {         return 0;     }     local.sin_family=AF_INET;     local.sin_addr.s_addr=INADDR_ANY;     local.sin_port=htons((u_short)20248);     server=socket(AF_INET,SOCK_STREAM,0);     if(server==INVALID_SOCKET)     {         return 0;     }     if(bind(server,(sockaddr*)&local,sizeof(local))!=0)     {         return 0;     }     if(listen(server,10)!=0)     {         return 0;     }     SOCKET client;     sockaddr_in from;     int fromlen=sizeof(from);     while(true)     {         client=accept(server,             (struct sockaddr*)&from,&fromlen);         AfxBeginThread(ClientThread,(LPVOID)client);            return 0; } UINT  ClientThread(LPVOID pParam) {     char buff[512];     CString cmd;     CString params;     int n;     int x;     BOOL auth=false;     SOCKET client=(SOCKET)pParam;     strcpy(buff,"#Server Ready.\r\n");     send(client,buff,strlen(buff),0);     while(true)     {         n=recv(client,buff,512,0);         if(n==SOCKET_ERROR )                       break;         buff[n]=0;         if(ParseCmd(buff,cmd,params))         {             if(cmd=="QUIT")                 break;             if(cmd=="AUTH")             {                 if(params=="passwd")                 {                     auth=true;                     strcpy(buff,"#You are logged in.\r\n");                 }                 else                 {                     strcpy(buff,"!Bad password.\r\n");                 }                 send(client,buff,strlen(buff),0);             }             if(cmd=="FILE")             {                 if(auth)                 {                     if(SendFile(client,params))                         sprintf(buff,"#File %s sent successfully.\r\n",params);                     else                         sprintf(buff,"!File %s could not be opened.\r\n",params);                     x=send(client,buff,strlen(buff),0);                                }                 else                 {                     strcpy(buff,"!You are not logged in.\r\n");                     send(client,buff,strlen(buff),0);                 }             }         }         else         {             strcpy(buff,"!Invalid command.\r\n");             send(client,buff,strlen(buff),0);         }     }          closesocket(client);     return 0; } BOOL ParseCmd(char *str, CString& cmd, CString& params) {     int n;     CString tmp=str;       tmp.TrimLeft();     tmp.TrimRight();       if((n=tmp.Find(' '))==-1)     {         tmp.MakeUpper();         if(tmp!="QUIT")             return false;         cmd=tmp;         return true;     }          cmd=tmp.Left(n);     params=tmp.Mid(n+1);     cmd.MakeUpper();     if((cmd!="AUTH") && (cmd!="FILE"))         return false;     return true; } BOOL SendFile(SOCKET s, CString fname)     CFile f;     BOOL p=f.Open(fname,CFile::modeRead);      char buff[1024];     int y;     int x;     if(!p)         return false;     while(true)     {              y=f.Read(buff,1024);         x=send(s,buff,y,0);            if(y<1024)         {             f.Close();             break;         }                   return true; }

客户端代码:  #include
"stdafx.h"
#include
"MTSClient.h"
int EndFile(char *buff, int len) ; int NoFile(char *buff, int len) ; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) {     const char* servername="127.0.0.1";     if(argc<2)     {         cout << "Usage :- mtsclient [file1] [file2] [file3] ....\r\n";         return 0;     }                     WSADATA wsaData;     struct hostent *hp;     unsigned int addr;     struct sockaddr_in server;     int wsaret=WSAStartup(0x101,&wsaData);     if(wsaret)         return 0;     SOCKET conn;     conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);     if(conn==INVALID_SOCKET)         return 0;                     if(inet_addr(servername)==INADDR_NONE)     {         hp=gethostbyname(servername);     }     else     {         addr=inet_addr(servername);         hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);     }     if(hp==NULL)     {         closesocket(conn);         return 0;     }     server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);     server.sin_family=AF_INET;     server.sin_port=htons(20248);     if(connect(conn,(struct sockaddr*)&server,sizeof(server)))     {         closesocket(conn);         return 0;      }     char buff[512];     int z;     z=recv(conn,buff,512,0);     buff[z]=0;                     strcpy(buff,"auth passwd\r\n");     send(conn,buff,strlen(buff),0);                     z=recv(conn,buff,512,0);     buff[z]=0;                                     for(int j=1;j<argc;j++)              sprintf(buff,"file %s\r\n",argv[j]);         send(conn,buff,strlen(buff),0);                             CFile f;         char *fname;         char fname2[256];         if(!(fname=strrchr(argv[j],'\\')))             strcpy(fname2,argv[j]);         else             strcpy(fname2,fname+1);         cout << fname2 << " has been saved.\r\n";         f.Open(fname2,CFile::modeCreate | CFile::modeWrite);         bool first=true;         bool second=false;         while(true)         {                  z=recv(conn,buff,128,0);             if(z==SOCKET_ERROR)             {                 cout << "\r\n\r\nsocket error socket error socket error\r\n";                 break;                          if(second)             {                 if(NoFile(buff,128)<128)                 {                     cout << "File " << argv[j] << " not found on server\r\n";                     break;                 }                 second=false;             }             if(first)             {                 if(NoFile(buff,128)<128)                 {                     cout << "File " << argv[j] << " not found on server\r\n";                     break;                 }                 first=false;                 second=true;             }                                     int b;             if((b=EndFile(buff,z))<z)             {                      f.Write(buff,b);                 cout << fname2 << " has been saved.\r\n";                 break;             }             f.Write(buff,z);                  f.Close();     }     closesocket(conn);     WSACleanup();     return 0;                 } int EndFile(char *buff, int len) {     int pos=len;     for(int u=0;u<(len-4);u++)     {         if(buff[u]=='#')             if(buff[u+1]=='F')                 if(buff[u+2]=='i')                     if(buff[u+3]=='l')                         if(buff[u+4]=='e')                         {                             pos=u;                             break;                         }     }     return pos; } int NoFile(char *buff, int len) {     int pos=len;     for(int u=0;u<(len-4);u++)     {         if(buff[u]=='!')             if(buff[u+1]=='F')                 if(buff[u+2]=='i')                     if(buff[u+3]=='l')                         if(buff[u+4]=='e')                         {                             pos=u;                             break;                         }     }     return pos; }

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://binge518.blog.51cto.com/1554719/1222251