Want more features on Pastebin? Sign Up, it's FREE!
Guest

Client.cpp

By: a guest on Nov 10th, 2012  |  syntax: C++  |  size: 9.60 KB  |  views: 57  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }
clone this paste RAW Paste Data