Advertisement
Guest User

Client.cpp

a guest
Nov 10th, 2012
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.60 KB | None | 0 0
  1. // CLIENT TCP PROGRAM
  2. // Revised and tidied up by
  3. // J.W. Atwood
  4. // 1999 June 30
  5.  
  6.  
  7.  
  8. char* getmessage(char *);
  9.  
  10.  
  11.  
  12. /* send and receive codes between client and server */
  13. /* This is your basic WINSOCK shell */
  14. #pragma comment( linker, "/defaultlib:ws2_32.lib" )
  15. #include <winsock2.h>
  16. #include <ws2tcpip.h>
  17.  
  18. #include <winsock.h>
  19. #include <stdio.h>
  20. #include <iostream>
  21.  
  22. #include <windows.h>
  23.  
  24. #include <fstream>
  25. #include <string>
  26.  
  27. using namespace std;
  28.  
  29. //user defined port number
  30. #define REQUEST_PORT 0x5000;
  31.  
  32. int port=REQUEST_PORT;
  33.  
  34.  
  35.  
  36. //socket data types
  37. SOCKET s;
  38. SOCKADDR_IN sa;         // filled by bind
  39. SOCKADDR_IN sa_in;      // fill with server info, IP, port
  40.  
  41.  
  42.  
  43. //buffer data types
  44. char szbuffer[1024];
  45.  
  46. char *buffer;
  47.  
  48. int ibufferlen=0;
  49.  
  50. int ibytessent;
  51. int ibytesrecv=0;
  52.  
  53.  
  54.  
  55. //host data types
  56. HOSTENT *hp;
  57. HOSTENT *rp;
  58.  
  59. char localhost[11],
  60.      remotehost[11];
  61.  
  62.  
  63. //other
  64.  
  65. HANDLE test;
  66.  
  67. DWORD dwtest;
  68.  
  69.  
  70. //packet
  71.  
  72. struct Packet {
  73.     char header[7];
  74.     char sequence[1];
  75.     char message[1016];
  76. };
  77.  
  78.  
  79. //reference for used structures
  80.  
  81. /*  * Host structure
  82.  
  83.     struct  hostent {
  84.     char    FAR * h_name;             official name of host *
  85.     char    FAR * FAR * h_aliases;    alias list *
  86.     short   h_addrtype;               host address type *
  87.     short   h_length;                 length of address *
  88.     char    FAR * FAR * h_addr_list;  list of addresses *
  89. #define h_addr  h_addr_list[0]            address, for backward compat *
  90. };
  91.  
  92.  * Socket address structure
  93.  
  94.  struct sockaddr_in {
  95.  short   sin_family;
  96.  u_short sin_port;
  97.  struct  in_addr sin_addr;
  98.  char    sin_zero[8];
  99.  }; */
  100.  
  101.  
  102. int main(void){
  103.  
  104.     WSADATA wsadata;
  105.    
  106.     //Blank Packet
  107.     Packet packet;
  108.     memset(&packet,0,1024*sizeof(char));
  109.  
  110.     try {
  111.  
  112.         if (WSAStartup(0x0202,&wsadata)!=0){  
  113.             cout<<"Error in starting WSAStartup()" << endl;
  114.         } else {
  115.             buffer="WSAStartup was successful\n";  
  116.             WriteFile(test,buffer,sizeof(buffer),&dwtest,NULL);
  117.  
  118.             /* Display the wsadata structure */
  119.             cout<< endl
  120.                 << "wsadata.wVersion "       << wsadata.wVersion       << endl
  121.                 << "wsadata.wHighVersion "   << wsadata.wHighVersion   << endl
  122.                 << "wsadata.szDescription "  << wsadata.szDescription  << endl
  123.                 << "wsadata.szSystemStatus " << wsadata.szSystemStatus << endl
  124.                 << "wsadata.iMaxSockets "    << wsadata.iMaxSockets    << endl
  125.                 << "wsadata.iMaxUdpDg "      << wsadata.iMaxUdpDg      << endl;
  126.         }  
  127.  
  128.  
  129.         //Display name of local host.
  130.  
  131.         gethostname(localhost,10);
  132.         cout<<"Local host name is \"" << localhost << "\"" << endl;
  133.  
  134.         if((hp=gethostbyname(localhost)) == NULL)
  135.             throw "gethostbyname failed\n";
  136.  
  137.         //Ask for name of remote server
  138.  
  139.         cout << "please enter your remote server name :" << flush ;  
  140.         cin >> remotehost ;
  141.         cout << "Remote host name is: \"" << remotehost << "\"" << endl;
  142.  
  143.         if((rp=gethostbyname(remotehost)) == NULL)
  144.             throw "remote gethostbyname failed\n";
  145.  
  146.         //Create the socket
  147.         if((s = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
  148.             throw "Socket failed\n";
  149.         /* For UDP protocol replace SOCK_STREAM with SOCK_DGRAM */
  150.  
  151.         memset(&sa,0,sizeof(sa));
  152.         sa.sin_family = AF_INET;
  153.         sa.sin_port = htons(port);
  154.         sa.sin_addr.s_addr = htonl(INADDR_ANY); //host to network
  155.         //bind the port to the socket
  156.         if (bind(s,(LPSOCKADDR)&sa,sizeof(sa)) == SOCKET_ERROR)
  157.                 throw "can't bind the socket";
  158.  
  159.  
  160.         //Specify server address for client to connect to server.
  161.         memset(&sa_in,0,sizeof(sa_in));
  162.         memcpy(&sa_in.sin_addr,rp->h_addr,rp->h_length);
  163.         sa_in.sin_family = rp->h_addrtype;  
  164.         sa_in.sin_port = htons(7000);
  165.  
  166.         //Display the host machine internet address
  167.  
  168.         cout << "Connecting to remote host:";
  169.         cout << inet_ntoa(sa_in.sin_addr) << endl;
  170.  
  171.         //Connect Client to the server
  172.         if (connect(s,(LPSOCKADDR)&sa_in,sizeof(sa_in)) == SOCKET_ERROR)
  173.             throw "connect failed\n";
  174.  
  175.         ibytessent = sendto(s, (const char*)&packet, sizeof(packet), 0,(struct sockaddr*) &sa_in, sizeof(sa_in));
  176.         //ibytessent = send(s, (const char*)&packet, sizeof(packet), 0);
  177.  
  178.         /* Have an open connection, so, server is
  179.  
  180.            - waiting for the client request message
  181.            - don't forget to append <carriage return>
  182.            - <line feed> characters after the send buffer to indicate end-of file */
  183.  
  184.         //append client message to szbuffer + send.
  185.  
  186.         /*sprintf_s(packet.header,"COMMAND");
  187.         sprintf_s(packet.message,"hello world!\r\n");
  188.  
  189.         ibytessent=0;    
  190.         ibufferlen = 1024;
  191.        
  192.         if (ibytessent = send(s,szbuffer,1024,0);== SOCKET_ERROR)
  193.             throw "Send failed\n";  
  194.         else
  195.             cout << "Message to server: " << szbuffer;
  196.  
  197.         //wait for reception of server response.
  198.         ibytesrecv=0;
  199.         if((ibytesrecv = recv(s,szbuffer,1024,0)) == SOCKET_ERROR)
  200.             throw "Receive failed\n";
  201.         else
  202.             cout << "hip hip hoorah!: Successful message replied from server: " << szbuffer;*/
  203.  
  204.         string choice;
  205.         char filename[1500];
  206.         bool error = true;
  207.         //Get command & file name
  208.         cout << "get or put file? ";
  209.         cin >> choice;
  210.         cout << "file name? ";
  211.         cin >> filename;
  212.         while(error) {
  213.             if(choice.compare("get") == 0) {
  214.                 cout << "RETR: " << filename << "\n";
  215.                 ofstream file (filename, ios::out);
  216.                 file.close();
  217.                 file.open(filename, ios::out|ios::binary|ios::trunc);
  218.                 ofstream::pos_type size;
  219.                 sprintf_s(packet.header, "RETR");
  220.                 sprintf_s(packet.message, filename);
  221.                 memset(szbuffer,0,1024*sizeof(char));
  222.                 memcpy(szbuffer,packet.header,8*sizeof(char));
  223.                 memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  224.                 //Send file name
  225.                 if (ibytessent = send(s,szbuffer,1024,0) == SOCKET_ERROR)
  226.                     throw "Send failed\n";
  227.                 memset(packet.message,0,1016*sizeof(char));
  228.                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  229.                 //Get size
  230.                 if((ibytesrecv = recv(s,szbuffer,1024,0)) == SOCKET_ERROR)
  231.                     throw "Receive failed\n";
  232.                 memcpy(packet.message, szbuffer+8*sizeof(char), 1016*sizeof(char));
  233.                 cout << "Size: " << atoi(packet.message) << "bytes\n";
  234.                 for (size = atoi(packet.message); size > 1016*sizeof(char); size -= 1016) {
  235.                     cout << "Size Remaining: " << size << "bytes\n";
  236.                     memset(packet.message,0,1016*sizeof(char));
  237.                     memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  238.                     //Get packet
  239.                     if((ibytesrecv = recv(s,szbuffer,1024,0)) == SOCKET_ERROR)
  240.                         throw "Receive failed\n";
  241.                     memcpy(packet.message, szbuffer+8*sizeof(char), 1016*sizeof(char));
  242.                     file.write(packet.message, 1016*sizeof(char));
  243.                 }
  244.                 memset(packet.message,0,1016*sizeof(char));
  245.                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  246.                 //Get last packet
  247.                 if((ibytesrecv = recv(s,szbuffer,1024,0)) == SOCKET_ERROR)
  248.                     throw "Receive failed\n";
  249.                 cout << "Last Packet Size: " << size << "bytes\n";
  250.                 memcpy(packet.message, szbuffer+8*sizeof(char), size*sizeof(char));
  251.                 file.write(packet.message, size*sizeof(char));
  252.                 memset(packet.message,0,1016*sizeof(char));
  253.                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  254.                 file.close();
  255.                 cout << "Transfer Complete!\n";
  256.                 error = false;
  257.             } else if(choice.compare("put") == 0) {
  258.                 cout << "STOR: " << filename << "\n";
  259.                 ifstream file (filename, ios::in|ios::binary|ios::ate);
  260.                 ifstream::pos_type size;
  261.                 if(file.is_open()) {
  262.                     sprintf_s(packet.header, "STOR");
  263.                     sprintf_s(packet.message, filename);
  264.                     memset(szbuffer,0,1024*sizeof(char));
  265.                     memcpy(szbuffer,packet.header,8*sizeof(char));
  266.                     memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  267.                     //Send file name
  268.                     if (ibytessent = send(s,szbuffer,1024,0) == SOCKET_ERROR)
  269.                         throw "Send failed\n";
  270.                     size = file.tellg();
  271.                     memset(packet.message,0,1016*sizeof(char));
  272.                     memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  273.                     itoa((int)size,packet.message,10);
  274.                     memcpy(szbuffer,packet.header,8*sizeof(char));
  275.                     memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  276.                     cout << atoi(packet.message) << "\n";
  277.                     //Send size
  278.                     if (ibytessent = send(s,szbuffer,1024,0) == SOCKET_ERROR)
  279.                         throw "Send failed\n";
  280.                     file.seekg(0, ios::beg);
  281.                     memset(packet.message,0,1016*sizeof(char));
  282.                     memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  283.                     while(file.read(packet.message,1016*sizeof(char))) {
  284.                         memcpy(szbuffer,packet.header,8*sizeof(char));
  285.                         memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  286.                         //Send packet
  287.                         if (ibytessent = send(s,szbuffer,1024,0) == SOCKET_ERROR)
  288.                             throw "Send failed\n";
  289.                         memset(packet.message,0,1016*sizeof(char));
  290.                         memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  291.                         size -= 1016;
  292.                     }
  293.                     memcpy(szbuffer,packet.header,8*sizeof(char));
  294.                     memcpy(szbuffer+8*sizeof(char),packet.message,size*sizeof(char));
  295.                     //Send last packet
  296.                     if((ibytessent = send(s,szbuffer,1024,0))==SOCKET_ERROR)
  297.                         throw "error in send in server program\n";
  298.                     memset(packet.message,0,1016*sizeof(char));
  299.                     memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  300.                     file.close();
  301.                     error = false;
  302.                 }
  303.                 else {
  304.                     //No file found stuff
  305.                     cout << "File not found or incorrect.\n";
  306.                     cout << "\nnew file name? ";
  307.                     cin >> filename;
  308.                     error = true;
  309.                 }
  310.             } else {
  311.                 cout << "Invalid command, only get or put accepted!\n";
  312.                 cout << "get or put file? ";
  313.                 cin >> choice;
  314.                 error = true;
  315.             }
  316.         }
  317.  
  318.     } // try loop
  319.  
  320.     //Display any needed error response.
  321.  
  322.     catch (char *str) { cerr<<str<<":"<<dec<<WSAGetLastError()<<endl;}
  323.  
  324.     //close the client socket
  325.     closesocket(s);
  326.  
  327.     /* When done uninstall winsock.dll (WSACleanup()) and exit */
  328.     WSACleanup();  
  329.     system("pause");
  330.     return 0;
  331. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement