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

Server.cpp

By: a guest on Nov 10th, 2012  |  syntax: C++  |  size: 9.21 KB  |  views: 51  |  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. //    SERVER TCP PROGRAM
  2. // revised and tidied up by
  3. // J.W. Atwood
  4. // 1999 June 30
  5. // There is still some leftover trash in this code.
  6.  
  7. /* send and receive codes between client and server */
  8. /* This is your basic WINSOCK shell */
  9. #pragma comment( linker, "/defaultlib:ws2_32.lib" )
  10. #include <winsock2.h>
  11. #include <ws2tcpip.h>
  12.  
  13. #include <winsock.h>
  14. #include <iostream>
  15. #include <windows.h>
  16.  
  17. #include <fstream>
  18.  
  19. using namespace std;
  20.  
  21. //port data types
  22.  
  23. #define REQUEST_PORT 0x5001
  24.  
  25. int port=REQUEST_PORT;
  26.  
  27. //socket data types
  28. SOCKET s;
  29.  
  30. SOCKET s1;
  31. SOCKADDR_IN sa;      // filled by bind
  32. SOCKADDR_IN sa1;     // fill with server info, IP, port
  33. SOCKADDR_IN sa_in;
  34. union {struct sockaddr generic;
  35. struct sockaddr_in ca_in;}ca;
  36.  
  37. int calen=sizeof(ca);
  38.  
  39. //buffer data types
  40.  
  41. char szbuffer[1024];
  42.  
  43. char *buffer;
  44. int ibufferlen;
  45. int ibytesrecv;
  46.  
  47. int ibytessent;
  48.  
  49. //host data types
  50.  
  51. char localhost[11];
  52.  
  53. HOSTENT *hp;
  54.  
  55. //wait variables
  56.  
  57. int nsa1;
  58.  
  59. int r,infds=1, outfds=0;
  60.  
  61. #define UTIMER 300000
  62. #define STIMER 0
  63. struct timeval timeout;
  64.  
  65. const struct timeval *tp=&timeout;
  66.  
  67. fd_set readfds;
  68.  
  69. //others
  70.  
  71. HANDLE test;
  72.  
  73. DWORD dwtest;
  74.  
  75. //packet
  76.  
  77. struct Packet {
  78.         char header[8];
  79.         char sequence[1];
  80.         char message[1016];
  81. };
  82.  
  83. //reference for used structures
  84.  
  85. /*  * Host structure
  86.  
  87. struct  hostent {
  88. char    FAR * h_name;             official name of host *
  89. char    FAR * FAR * h_aliases;    alias list *
  90. short   h_addrtype;               host address type *
  91. short   h_length;                 length of address *
  92. char    FAR * FAR * h_addr_list;  list of addresses *
  93. #define h_addr  h_addr_list[0]            address, for backward compat *
  94. };
  95.  
  96. * Socket address structure
  97.  
  98. struct sockaddr_in {
  99. short   sin_family;
  100. u_short sin_port;
  101. struct  in_addr sin_addr;
  102. char    sin_zero[8];
  103. }; */
  104.  
  105. int main(void){
  106.  
  107.         WSADATA wsadata;
  108.  
  109.         timeout.tv_sec=STIMER;
  110.         timeout.tv_usec=UTIMER;
  111.  
  112.         //Blank packet
  113.         Packet packet;
  114.         memset(&packet,0,1024*sizeof(char));
  115.  
  116.         try{                     
  117.                 if (WSAStartup(0x0202,&wsadata)!=0){  
  118.                         cout<<"Error in starting WSAStartup()\n";
  119.                 }else{
  120.                         buffer="WSAStartup was suuccessful\n";  
  121.                         WriteFile(test,buffer,sizeof(buffer),&dwtest,NULL);
  122.  
  123.                         /* display the wsadata structure */
  124.                         cout<< endl
  125.                                 << "wsadata.wVersion "       << wsadata.wVersion       << endl
  126.                                 << "wsadata.wHighVersion "   << wsadata.wHighVersion   << endl
  127.                                 << "wsadata.szDescription "  << wsadata.szDescription  << endl
  128.                                 << "wsadata.szSystemStatus " << wsadata.szSystemStatus << endl
  129.                                 << "wsadata.iMaxSockets "    << wsadata.iMaxSockets    << endl
  130.                                 << "wsadata.iMaxUdpDg "      << wsadata.iMaxUdpDg      << endl;
  131.                 }  
  132.  
  133.                 //Display info of local host
  134.  
  135.                 gethostname(localhost,10);
  136.                 cout<<"hostname: "<<localhost<< endl;
  137.  
  138.                 if((hp=gethostbyname(localhost)) == NULL) {
  139.                         cout << "gethostbyname() cannot get local host info?"
  140.                                 << WSAGetLastError() << endl;
  141.                         exit(1);
  142.                 }
  143.  
  144.                 //Create the server socket
  145.                 if((s = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
  146.                         throw "can't initialize socket";
  147.                 // For UDP protocol replace SOCK_STREAM with SOCK_DGRAM
  148.  
  149.  
  150.                 //Fill-in Server Port and Address info.
  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);
  155.  
  156.                 //Bind the server port
  157.  
  158.                 if (bind(s,(LPSOCKADDR)&sa,sizeof(sa)) == SOCKET_ERROR)
  159.                         throw "can't bind the socket";
  160.                 cout << "Bind was successful" << endl;
  161.  
  162.                 //Successfull bind, now listen for client requests.
  163.  
  164.                 /*if(listen(s,10) == SOCKET_ERROR)
  165.                         throw "couldn't  set up listen on socket";
  166.                 else cout << "Listen was successful" << endl;*/
  167.  
  168.                 //wait loop
  169.  
  170.                 while(1)
  171.  
  172.                 {
  173.                         FD_ZERO(&readfds);
  174.                         FD_SET(s,&readfds);  //always check the listener
  175.  
  176.                         if(!(outfds=select(1,&readfds,NULL,NULL,tp))) {} //timed out, return
  177.  
  178.                         int size = sizeof(sa_in);
  179.  
  180.                         if (outfds == 1) {//receive frame
  181.                                 if(ibytesrecv = recvfrom(s, (char*)& packet, sizeof(packet),0, (struct sockaddr*)&sa_in, &size) == SOCKET_ERROR)
  182.                                         throw "Receive error in server program\n";
  183.                                 cout << "yay?" << endl;
  184.                         }
  185.                         if (ibytesrecv != 0)
  186.                                 cout << ibytesrecv << endl;
  187.  
  188.                         /*else if (outfds == SOCKET_ERROR) throw "failure in Select";
  189.  
  190.                         else if (FD_ISSET(s,&readfds))  cout << "got a connection request" << endl;
  191.  
  192.                         //Found a connection request, try to accept.
  193.  
  194.                         if((s1=accept(s,&ca.generic,&calen))==INVALID_SOCKET)
  195.                                 throw "Couldn't accept connection\n";
  196.  
  197.                         //Connection request accepted.
  198.                         cout<<"accepted connection from "<<inet_ntoa(ca.ca_in.sin_addr)<<":"
  199.                                 <<hex<<htons(ca.ca_in.sin_port)<<endl;
  200.  
  201.                         //Fill in packet from accepted request.
  202.                         if((ibytesrecv = recv(s1,szbuffer,1024,0)) == SOCKET_ERROR)
  203.                                 throw "Receive error in server program\n";*/
  204.  
  205.                         //Get file name
  206.                         /*memset(szbuffer,0,1024*sizeof(char));
  207.                         if((ibytesrecv = recv(s1,szbuffer,1024,0)) == SOCKET_ERROR)
  208.                                 throw "Receive error in server program\n";;
  209.                         memset(&packet,0,1024*sizeof(char));
  210.                         memcpy(packet.header,szbuffer,8*sizeof(char));
  211.                         memcpy(packet.message,szbuffer+8*sizeof(char),1016*sizeof(char));
  212.                         cout << packet.header << "\n";
  213.                         cout << packet.message << "\n";
  214.  
  215.                         string header(packet.header);
  216.                         char location[1500];
  217.  
  218.                         if(header.compare("RETR") == 0) {
  219.                                 sprintf_s(location, packet.message);
  220.                                 cout << "RETR: " << location << "\n";
  221.                                 ifstream file (location, ios::in|ios::binary|ios::ate);
  222.                                 ifstream::pos_type size;
  223.                                 if(file.is_open()) {
  224.                                         size = file.tellg();
  225.                                         memset(packet.message,0,1016*sizeof(char));
  226.                                         memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  227.                                         itoa((int)size,packet.message,10);
  228.                                         memcpy(szbuffer,packet.header,8*sizeof(char));
  229.                                         memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  230.                                         //Send size
  231.                                         if((ibytessent = send(s1,szbuffer,1024,0))==SOCKET_ERROR)
  232.                                                 throw "error in send in server program\n";
  233.                                         cout << "Size: " << atoi(packet.message) << "bytes\n";
  234.                                         file.seekg(0, ios::beg);
  235.                                         memset(packet.message,0,1016*sizeof(char));
  236.                                         memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  237.                                         while(file.read(packet.message,1016*sizeof(char))) {
  238.                                                 memcpy(szbuffer,packet.header,8*sizeof(char));
  239.                                                 memcpy(szbuffer+8*sizeof(char),packet.message,1016*sizeof(char));
  240.                                                 //Send packet
  241.                                                 if((ibytessent = send(s1,szbuffer,1024,0))==SOCKET_ERROR)
  242.                                                         throw "error in send in server program\n";
  243.                                                 memset(packet.message,0,1016*sizeof(char));
  244.                                                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  245.                                                 size -= 1016;
  246.                                         }
  247.                                         memcpy(szbuffer,packet.header,8*sizeof(char));
  248.                                         memcpy(szbuffer+8*sizeof(char),packet.message,size*sizeof(char));
  249.                                         //Send last packet                            
  250.                                         if((ibytessent = send(s1,szbuffer,1024,0))==SOCKET_ERROR)
  251.                                                 throw "error in send in server program\n";
  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.                                 }
  257.                                 else {
  258.                                         memset(packet.message,0,1016*sizeof(char));
  259.                                         memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  260.                                         //Send packet
  261.                                         memcpy(szbuffer,packet.header,8*sizeof(char));
  262.                                         memcpy(szbuffer+8*sizeof(char),packet.message,size*sizeof(char));
  263.                                         if((ibytessent = send(s1,szbuffer,1024,0))==SOCKET_ERROR)
  264.                                                 throw "error in send in server program\n";
  265.                                         cout << "No such file.\n";
  266.                                        
  267.                                 }
  268.                         } else if (header.compare("STOR") == 0) {
  269.                                 sprintf_s(location, packet.message);
  270.                                 ofstream file (location, ios::out);
  271.                                 file.close();
  272.                                 file.open(location, ios::out|ios::binary|ios::trunc);
  273.                                 memset(packet.message,0,1016*sizeof(char));
  274.                                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  275.                                 //Get file size
  276.                                 if((ibytesrecv = recv(s1,szbuffer,1024,0)) == SOCKET_ERROR)
  277.                                         throw "Receive error in server program\n";
  278.                                 memcpy(packet.message, szbuffer+8*sizeof(char), 1016*sizeof(char));
  279.                                 ofstream::pos_type size;
  280.                                 cout << "Size: " << atoi(packet.message) << "bytes\n";;
  281.                                 for (size = atoi(packet.message); size > 1016*sizeof(char); size -= 1016) {
  282.                                         memset(packet.message,0,1016*sizeof(char));
  283.                                         memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  284.                                         //Get packet
  285.                                         if((ibytesrecv = recv(s1,szbuffer,1024,0)) == SOCKET_ERROR)
  286.                                                 throw "Receive error in server program\n";
  287.                                         memcpy(packet.message, szbuffer+8*sizeof(char), 1016*sizeof(char));
  288.                                         file.write(packet.message, 1016*sizeof(char));
  289.                                 }
  290.                                 memset(packet.message,0,1016*sizeof(char));
  291.                                 memset(szbuffer+8*sizeof(char),0,1016*sizeof(char));
  292.                                 //Get last packet
  293.                                 if((ibytesrecv = recv(s1,szbuffer,1024,0)) == SOCKET_ERROR)
  294.                                         throw "Receive error in server program\n";
  295.                                 memcpy(packet.message, szbuffer+8*sizeof(char), size*sizeof(char));
  296.                                 file.write(packet.message, size*sizeof(char));
  297.                                 file.close();
  298.                                 cout << "Transfer Complete\n";
  299.                         } else {
  300.  
  301.                         }*/
  302.                 }//wait loop
  303.  
  304.         } //try loop
  305.  
  306.         //Display needed error message.
  307.  
  308.         catch(char* str) { cerr<<str<<WSAGetLastError()<<endl;}
  309.  
  310.         //close Client socket
  311.         closesocket(s1);               
  312.  
  313.         //close server socket
  314.         closesocket(s);
  315.  
  316.         /* When done uninstall winsock.dll (WSACleanup()) and exit */
  317.         WSACleanup();
  318.         system("pause");
  319.         return 0;
  320. }
clone this paste RAW Paste Data