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 }
1.2.15