Advertisement
Guest User

Server.cpp

a guest
Nov 10th, 2012
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.21 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement