Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

tcp.c

00001 /******************************************************************************\
00002  * tcp (Library)                                                              *
00003  ******************************************************************************
00004  * Library for tcp. for win32 and Unix(BSD)                                   *
00005  * auteur   : Leto, @ngel$                                                    *
00006  * date     : 7-09-1999                                                      *
00007 \******************************************************************************/
00008 //      Leto's 1st steps in network programming.
00009 //      server side code. + @ngel$ win32 add-ons...
00010 //      Blux... win...
00011 
00012 #include "tcp.h"
00013 
00014 struct sockaddr_in srv_addr, cli_addr;
00015 int cli_addr_len = sizeof(srv_addr);
00016 int sSocket;
00017 char szerror[128];
00018 int nerror;
00019 char hostname[128];
00020 
00021 // start a server with x connections...
00022 int tcpstartsrv(int port,
00023                                    int nnoc)
00024 {
00025         // struct hostent *h_info;
00026 
00027         // initialisation de winsock...
00028         #ifdef WIN32
00029                 // winsock startup...
00030                 WSADATA                 WSAData;
00031                 // initializing in 1.1 mode...
00032                 int nRc = WSAStartup(0x0101, &WSAData);
00033                 // check initialization...
00034                 if (nRc)
00035                 {
00036                         nerror = 1;
00037                         sgeterror();
00038                         return -1;
00039                 }
00040                 // check version...
00041                 if (WSAData.wVersion != 0x0101)
00042                 {
00043                         nerror = 2;
00044                         sgeterror();
00045                         WSACleanup();
00046                         return -1;
00047                 }
00048         #endif
00049         /* 
00050          * Getting host IP is'nt necessary, because you want 
00051          * to answer all requests not only the request for a particular 
00052          * name of the host.
00053          
00054         // get host information
00055         if ( gethostname(hostname, sizeof(hostname))!= 0 ) 
00056         {
00057                 nerror = 5;
00058                 sgeterror();
00059                 return -1;
00060         }
00061 
00062         // get host IP
00063         if ( (h_info=gethostbyname(hostname)) == 0) {
00064                 nerror = 4;
00065                 sgeterror();
00066                 return -1;
00067         }
00068         */
00069                 
00070         // open the socket...
00071         sSocket = socket(AF_INET, SOCK_STREAM, 0);
00072 
00073         // bind it to localhost...
00074         memset(&srv_addr, 0, sizeof(srv_addr));
00075 
00076         srv_addr.sin_family = AF_INET;
00077         // addr = 0.0.0.0, it's fine.
00078         //memcpy( &srv_addr.sin_addr, h_info->h_addr_list[0], h_info->h_length);
00079 
00080         srv_addr.sin_port = htons((unsigned short)port);
00081         if ( bind(sSocket, (struct sockaddr *)&srv_addr, sizeof(srv_addr)) != 0 ) 
00082         {
00083                 nerror = 8;
00084                 sgeterror();
00085                 close(sSocket);
00086                 sSocket = -1;
00087                 return -1;
00088         }
00089         // listening...
00090         listen(sSocket, nnoc);
00091         { 
00092                 int yes = 1;
00093                 setsockopt(sSocket,  IPPROTO_TCP, SO_REUSEADDR, (char*)&yes, sizeof(yes));
00094         }
00095         return 0;
00096 } // end tcpstartserver
00097 
00098 // start a tcp Client
00099 int tcpstartclient(int port,
00100                                    char* server)
00101 {
00102 
00103         struct hostent *h_info;
00104         // initialisation de winsock...
00105         #ifdef WIN32
00106                 // winsock startup...
00107                 WSADATA                 WSAData;
00108                 // initializing in 1.1 mode...
00109                 int nRc = WSAStartup(0x0101, &WSAData);
00110                 // check initialization...
00111                 if (nRc)
00112                 {
00113                         nerror = 1;
00114                         sgeterror();
00115                         return -1;
00116                 }
00117                 // check version...
00118                 if (WSAData.wVersion != 0x0101)
00119                 {
00120                         nerror = 2;
00121                         sgeterror();
00122                         WSACleanup();
00123                         return -1;
00124                 }
00125         #endif
00126         // TODO add error code in case sSocket is not valide...
00127         // nerror = 3;
00128         sSocket = socket(AF_INET, SOCK_STREAM, 0);
00129 
00130         // get Host IP
00131         if ((h_info = gethostbyname(server)) == NULL) 
00132         {
00133                 nerror = 4;
00134                 sgeterror();
00135                 return -1;
00136         }
00137 
00138         memset(
00139                 &srv_addr, 
00140                 0, 
00141                 sizeof(srv_addr));
00142         srv_addr.sin_family = AF_INET;
00143         memcpy(
00144                 &srv_addr.sin_addr.s_addr, 
00145                 h_info->h_addr_list[0], 
00146                 4);
00147         srv_addr.sin_port = htons((unsigned short)port);
00148 
00149         if (connect(sSocket, (struct sockaddr *)&srv_addr, sizeof(srv_addr))!=0) 
00150         {
00151                 nerror = 7;
00152                 sgeterror();
00153                 return -1;
00154         }
00155         return 0;
00156 } // end tcpstartclient
00157 
00158 // put error on the stdout
00159 int geterror()
00160 {
00161         if (!sgeterror())
00162         {
00163                 // known error
00164                 printf("Error : %s\n", szerror);
00165         }
00166         else
00167         {
00168                 printf("Unknown error : ");
00169                 if (nerror != 0)
00170                 {
00171                         // unknown normal error
00172                         printf("%x\n", nerror);
00173                 }
00174                 else 
00175                 {
00176                         // in case of Non normal error
00177                         #ifdef WIN32
00178                                 printf("%x\n",WSAGetLastError());
00179                                 return WSAGetLastError();
00180                         #else
00181                                 perror("perror");
00182                         #endif
00183                 }
00184         }
00185         return nerror;
00186 } // end geterror()
00187 
00188 // String error Processing...
00189 int sgeterror()
00190 {
00191         // Normal errors
00192         // TODO
00193         switch(nerror)
00194         {
00195         case 1  : sprintf(szerror, "Cannot initialize Winsock");
00196                 return 0;
00197         case 2  : sprintf(szerror, "Incompatible ver of Winsock");
00198                 return 0;
00199         case 3  : sprintf(szerror , "Impossible to start socket");
00200                 return 0;
00201         case 4  : sprintf(szerror , "Cannot resolve Hostname");
00202                 return 0;
00203         case 5  : sprintf(szerror, "Can't get server hostname");
00204                 return 0;
00205         case 6  : sprintf(szerror, "Can't bind socket to localhost");
00206                 return 0;
00207         case 7  : sprintf(szerror, "Can't connect");
00208                 return 0;
00209         case 8 : sprintf(szerror, "Can't start server (is another one running ?)");
00210                  return 0;
00211         //default : return -1;
00212         }
00213         // Windows WSA errors
00214         #ifdef WIN32
00215                 switch(WSAGetLastError())
00216                 {
00217                 case WSANOTINITIALISED  : sprintf(szerror, "WSANOTINITIALISED");        
00218                         break;
00219                 case WSAENETDOWN                : sprintf(szerror, "WSAENETDOWN");              
00220                         break;
00221                 case WSAEADDRINUSE              : sprintf(szerror, "WSAEADDRINUSE");            
00222                         break;
00223                 case WSAEINTR                   : sprintf(szerror, "WSAEINTR");                 
00224                         break;
00225                 case WSAEINPROGRESS             : sprintf(szerror, "WSAEINPROGRESS");           
00226                         break;
00227                 case WSAEALREADY                : sprintf(szerror, "WSAEALREADY");              
00228                         break;
00229                 case WSAEINVAL                  : sprintf(szerror, "WSAEINVAL");                        
00230                         break;
00231                 case WSAEADDRNOTAVAIL   : sprintf(szerror, "WSAEADDRNOTAVAIL"); 
00232                         break;
00233                 case WSAEAFNOSUPPORT    : sprintf(szerror, "WSAEAFNOSUPPORT");  
00234                         break;
00235                 case WSAECONNREFUSED    : sprintf(szerror, "WSAECONNREFUSED");  
00236                         break;
00237                 case WSAEFAULT                  : sprintf(szerror, "WSAEFAULT");                        
00238                         break;
00239                 case WSAEISCONN                 : sprintf(szerror, "WSAEISCONN");                       
00240                         break;
00241                 case WSAENETUNREACH             : sprintf(szerror, "WSAENETUNREACH");           
00242                         break;
00243                 case WSAENOBUFS                 : sprintf(szerror, "WSAENOBUFS");                       
00244                         break;
00245                 case WSAENOTSOCK                : sprintf(szerror, "WSAENOTSOCK");              
00246                         break;
00247                 case WSAETIMEDOUT               : sprintf(szerror, "WSAETIMEDOUT");             
00248                         break;
00249                 case WSAEWOULDBLOCK             : sprintf(szerror, "WSAEWOULDBLOCK");           
00250                         break;
00251                 case WSAEACCES                  : sprintf(szerror, "WSAEACCES");                        
00252                         break;
00253                 case WSAEMFILE                  : sprintf(szerror, "WSAEMFILE");                        
00254                         break;
00255                 case WSAEOPNOTSUPP              : sprintf(szerror, "WSAEOPNOTSUPP");            
00256                         break;
00257                 default: return -1;
00258                         break;
00259                 }
00260                 return 0;
00261         #else
00262                 return -1;
00263         #endif
00264 } // end sgeterror
00265 
00266 // close connection
00267 int tcpstop()
00268 {
00269         #ifdef WIN32
00270                 WSACleanup();
00271         #else
00272                 close(sSocket);
00273         #endif
00274         // TODO add close for the server sockets...
00275         return 0;
00276 } // end tcpstop
00277 
00278 int close_socket(int mySock)
00279 {
00280 #ifdef WIN32
00281         return closesocket(mySock);
00282 #else
00283         return close(mySock);
00284 #endif
00285 }

Generated on Fri May 16 13:01:45 2003 for Jelie by doxygen1.2.15