00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00022 int tcpstartsrv(int port,
00023 int nnoc)
00024 {
00025
00026
00027
00028 #ifdef WIN32
00029
00030 WSADATA WSAData;
00031
00032 int nRc = WSAStartup(0x0101, &WSAData);
00033
00034 if (nRc)
00035 {
00036 nerror = 1;
00037 sgeterror();
00038 return -1;
00039 }
00040
00041 if (WSAData.wVersion != 0x0101)
00042 {
00043 nerror = 2;
00044 sgeterror();
00045 WSACleanup();
00046 return -1;
00047 }
00048 #endif
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 sSocket = socket(AF_INET, SOCK_STREAM, 0);
00072
00073
00074 memset(&srv_addr, 0, sizeof(srv_addr));
00075
00076 srv_addr.sin_family = AF_INET;
00077
00078
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
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 }
00097
00098
00099 int tcpstartclient(int port,
00100 char* server)
00101 {
00102
00103 struct hostent *h_info;
00104
00105 #ifdef WIN32
00106
00107 WSADATA WSAData;
00108
00109 int nRc = WSAStartup(0x0101, &WSAData);
00110
00111 if (nRc)
00112 {
00113 nerror = 1;
00114 sgeterror();
00115 return -1;
00116 }
00117
00118 if (WSAData.wVersion != 0x0101)
00119 {
00120 nerror = 2;
00121 sgeterror();
00122 WSACleanup();
00123 return -1;
00124 }
00125 #endif
00126
00127
00128 sSocket = socket(AF_INET, SOCK_STREAM, 0);
00129
00130
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 }
00157
00158
00159 int geterror()
00160 {
00161 if (!sgeterror())
00162 {
00163
00164 printf("Error : %s\n", szerror);
00165 }
00166 else
00167 {
00168 printf("Unknown error : ");
00169 if (nerror != 0)
00170 {
00171
00172 printf("%x\n", nerror);
00173 }
00174 else
00175 {
00176
00177 #ifdef WIN32
00178 printf("%x\n",WSAGetLastError());
00179 return WSAGetLastError();
00180 #else
00181 perror("perror");
00182 #endif
00183 }
00184 }
00185 return nerror;
00186 }
00187
00188
00189 int sgeterror()
00190 {
00191
00192
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
00212 }
00213
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 }
00265
00266
00267 int tcpstop()
00268 {
00269 #ifdef WIN32
00270 WSACleanup();
00271 #else
00272 close(sSocket);
00273 #endif
00274
00275 return 0;
00276 }
00277
00278 int close_socket(int mySock)
00279 {
00280 #ifdef WIN32
00281 return closesocket(mySock);
00282 #else
00283 return close(mySock);
00284 #endif
00285 }