00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "vsisocket.h"
00032 #include "vsierror.h"
00033
00034 #include <netdb.h>
00035 #include <string.h>
00036
00037
00038 #include <sys/types.h>
00039 #include <sys/socket.h>
00040
00041
00042 #include <netinet/in.h>
00043
00044
00045 #include <unistd.h>
00046
00047
00048 #include <errno.h>
00049
00050
00051 #include <iostream>
00052
00053 #include "../interface/RioError.h"
00054
00055
00056 #include <sys/time.h>
00057
00058
00059 #include <unistd.h>
00060
00061 #include <stdio.h>
00062
00063 using namespace std;
00064
00065 const int VSI_INVALID_SOCKET = -1;
00066
00067
00068
00069
00070
00071 CvsiUDPsocket::CvsiUDPsocket()
00072 {
00073 m_Socket = VSI_INVALID_SOCKET;
00074 }
00075
00076 CvsiUDPsocket::~CvsiUDPsocket()
00077 {
00078 if(m_Socket != VSI_INVALID_SOCKET)
00079 {
00080 Close();
00081 }
00082 }
00083
00084
00085
00086 int CvsiUDPsocket::IsOpen()
00087 {
00088 if(m_Socket == VSI_INVALID_SOCKET)
00089 return false;
00090 else
00091 return true;
00092 }
00093
00094
00095
00096 int CvsiUDPsocket::Initialize(vsiIPaddress* LocalAddress)
00097 {
00098 int sock;
00099 struct sockaddr_in myaddress;
00100
00101 if(m_Socket != VSI_INVALID_SOCKET)
00102 {
00103 Close();
00104 }
00105
00106
00107 sock = socket (AF_INET, SOCK_DGRAM, 0);
00108 if(sock < 0 )
00109 {
00110 return VSI_ERROR_SOCKET_CREATION;
00111 }
00112
00113
00114 myaddress.sin_family = AF_INET;
00115 myaddress.sin_port = LocalAddress->Port;
00116
00117 if(LocalAddress->Host == VSI_SOCKET_UNDEFINED_IP_ADDRESS)
00118 myaddress.sin_addr.s_addr = INADDR_ANY;
00119 else
00120 myaddress.sin_addr.s_addr = LocalAddress->Host;
00121
00122
00123 if( bind (sock,(sockaddr *) &myaddress,sizeof(myaddress)) < 0)
00124 {
00125 close (sock);
00126 return VSI_ERROR_SOCKET_BIND;
00127 }
00128
00129 m_Socket = sock;
00130 return (0);
00131 }
00132
00133
00134
00135 int CvsiUDPsocket::Close()
00136 {
00137 if(m_Socket != VSI_INVALID_SOCKET)
00138 {
00139 close(m_Socket);
00140 m_Socket = VSI_INVALID_SOCKET;
00141 return (0);
00142 }
00143 return VSI_ERROR_SOCKET_NOT_OPEN;
00144 }
00145
00146
00147
00148 int CvsiUDPsocket::Send(vsiIPaddress* Target, char* Buffer, int nBytes)
00149 {
00150 struct sockaddr_in dest;
00151
00152 if(m_Socket == VSI_INVALID_SOCKET)
00153 {
00154 return VSI_ERROR_SOCKET_NOT_OPEN;
00155 }
00156
00157
00158 dest.sin_family = AF_INET;
00159 dest.sin_addr.s_addr = Target->Host;
00160 dest.sin_port = Target->Port;
00161
00162 int nb;
00163
00164
00165
00166 while(1)
00167 {
00168 nb = sendto ( m_Socket, Buffer, nBytes, MSG_WAITALL,
00169 (sockaddr*) &dest, sizeof (dest));
00170
00171 if(nb < 0)
00172 {
00173
00174
00175
00176
00177
00178 if(errno != ECONNREFUSED)
00179 {
00180 return VSI_ERROR_SOCKET_SEND;
00181 }
00182 }
00183 else
00184 {
00185 if(nb != nBytes)
00186 {
00187 return VSI_ERROR_SOCKET_SEND_INCOMPLETE;
00188 }
00189 return (0);
00190 }
00191 }
00192 }
00193
00194
00195
00196
00197 int CvsiUDPsocket::Receive(vsiIPaddress* Source, char* Buffer, int* nBytes)
00198 {
00199 struct sockaddr_in orig;
00200 unsigned int origsize = sizeof(orig);
00201
00202 if(m_Socket == VSI_INVALID_SOCKET)
00203 {
00204 return VSI_ERROR_SOCKET_NOT_OPEN;
00205 }
00206
00207 int nb = recvfrom ( m_Socket, Buffer, *nBytes, MSG_WAITALL,
00208 (sockaddr*) &orig, &origsize);
00209
00210 if(nb < 0)
00211 {
00212 Rioperror("CvsiUDPsocket::Receive()");
00213 return VSI_ERROR_SOCKET_RECV;
00214 }
00215
00216 Source->Host = orig.sin_addr.s_addr;
00217 Source->Port = orig.sin_port;
00218
00219 *nBytes = nb;
00220
00221 return (0);
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236 CvsiTCPwait::CvsiTCPwait()
00237 {
00238 m_Socket = VSI_INVALID_SOCKET;
00239 }
00240
00241 CvsiTCPwait::~CvsiTCPwait()
00242 {
00243 if(m_Socket != VSI_INVALID_SOCKET)
00244 {
00245 Close();
00246 }
00247 }
00248
00249
00250
00251 int CvsiTCPwait::IsOpen()
00252 {
00253 if(m_Socket == VSI_INVALID_SOCKET)
00254 return false;
00255 else
00256 return true;
00257 }
00258
00259
00260
00261 int CvsiTCPwait::Initialize(vsiIPaddress* LocalAddress, int Backlog)
00262 {
00263 int sock;
00264 struct sockaddr_in myaddress;
00265
00266 if(m_Socket != VSI_INVALID_SOCKET)
00267 {
00268 Close();
00269 }
00270
00271
00272 sock = socket (AF_INET, SOCK_STREAM, 0);
00273 if(sock < 0 )
00274 {
00275 return VSI_ERROR_SOCKET_CREATION;
00276 }
00277
00278
00279 int flag = 1;
00280 int rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag));
00281
00282 if( rc != 0 )
00283 {
00284 RioErr << "Error on setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, ...): "
00285 << rc << endl;
00286 }
00287
00288
00289 myaddress.sin_family = AF_INET;
00290 myaddress.sin_port = LocalAddress->Port;
00291
00292 if(LocalAddress->Host == VSI_SOCKET_UNDEFINED_IP_ADDRESS)
00293 myaddress.sin_addr.s_addr = INADDR_ANY;
00294 else
00295 myaddress.sin_addr.s_addr = LocalAddress->Host;
00296
00297
00298 if( bind (sock,(sockaddr *) &myaddress,sizeof(myaddress)) < 0)
00299 {
00300 close (sock);
00301 return VSI_ERROR_SOCKET_BIND;
00302 }
00303
00304 if( listen (sock, Backlog) < 0)
00305 {
00306 close (sock);
00307 return VSI_ERROR_SOCKET_LISTEN;
00308 }
00309
00310 m_Socket = sock;
00311 return (0);
00312 }
00313
00314
00315
00316 int CvsiTCPwait::Close()
00317 {
00318 if(m_Socket != VSI_INVALID_SOCKET)
00319 {
00320 close(m_Socket);
00321 m_Socket = VSI_INVALID_SOCKET;
00322 return (0);
00323 }
00324 return VSI_ERROR_SOCKET_NOT_OPEN;
00325 }
00326
00327
00328
00329 int CvsiTCPwait::Accept(CvsiTCPsocket* TCPsocket, vsiIPaddress* Source)
00330 {
00331 struct sockaddr_in From;
00332
00333
00334 if(m_Socket == VSI_INVALID_SOCKET)
00335 {
00336 return VSI_ERROR_SOCKET_NOT_OPEN;
00337 }
00338
00339 if(TCPsocket->m_Socket != VSI_INVALID_SOCKET)
00340 {
00341 return VSI_ERROR_SOCKET_INUSE;
00342 }
00343
00344 unsigned int n= sizeof(From);
00345 int sock = accept( m_Socket, (sockaddr* )&From, &n);
00346
00347 if(sock < 0)
00348 {
00349 return VSI_ERROR_SOCKET_ACCEPT;
00350 }
00351
00352 if(Source != 0)
00353 {
00354 Source->Host = From.sin_addr.s_addr;
00355 Source->Port = From.sin_port;
00356 }
00357
00358 TCPsocket->m_Socket = sock;
00359
00360 return 0;
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375 CvsiTCPsocket::CvsiTCPsocket()
00376 {
00377 m_Socket = VSI_INVALID_SOCKET;
00378 }
00379
00380 CvsiTCPsocket::~CvsiTCPsocket()
00381 {
00382 if(m_Socket != VSI_INVALID_SOCKET)
00383 {
00384 Close();
00385 }
00386 }
00387
00388
00389
00390 int CvsiTCPsocket::IsOpen()
00391 {
00392 if(m_Socket == VSI_INVALID_SOCKET)
00393 return false;
00394 else
00395 return true;
00396 }
00397
00398
00399
00400 int CvsiTCPsocket::Connect(vsiIPaddress* Target)
00401 {
00402 int sock;
00403 struct sockaddr_in dest;
00404
00405 if( m_Socket != VSI_INVALID_SOCKET )
00406 {
00407 Close();
00408 }
00409
00410
00411 sock = socket (AF_INET, SOCK_STREAM, 0);
00412 if( sock < 0 )
00413 {
00414 RioErr << "[vsisocket] Erro no socket: " << strerror(errno) << endl;
00415 return VSI_ERROR_SOCKET_CREATION;
00416 }
00417
00418
00419 dest.sin_family = AF_INET;
00420 dest.sin_addr.s_addr = Target->Host;
00421 dest.sin_port = Target->Port;
00422
00423
00424 if( connect ( sock, (sockaddr *) &dest, sizeof( dest ) ) < 0 )
00425 {
00426 RioErr << "[vsisocket] Erro no connect: " << strerror(errno) << endl;
00427 close (sock);
00428 return VSI_ERROR_SOCKET_CONNECT;
00429 }
00430
00431 m_Socket = sock;
00432 return( 0 );
00433 }
00434
00435
00436
00437 int CvsiTCPsocket::Close()
00438 {
00439 if(m_Socket != VSI_INVALID_SOCKET)
00440 {
00441 shutdown( m_Socket, SHUT_RDWR );
00442 close(m_Socket);
00443 m_Socket = VSI_INVALID_SOCKET;
00444 return (0);
00445 }
00446 return VSI_ERROR_SOCKET_NOT_OPEN;
00447 }
00448
00449
00450
00451 int CvsiTCPsocket::Send( char* Buffer, int nBytes )
00452 {
00453 if(m_Socket == VSI_INVALID_SOCKET)
00454 {
00455 return VSI_ERROR_SOCKET_NOT_OPEN;
00456 }
00457
00458 int nb;
00459 int nsent = 0;
00460 char *bf = Buffer;
00461
00462
00463
00464 while( true )
00465 {
00466 nb = send ( m_Socket, bf, nBytes-nsent, MSG_NOSIGNAL );
00467
00468
00469 if( nb < 0 )
00470 {
00471 return VSI_ERROR_SOCKET_SEND;
00472 }
00473 else
00474 {
00475 nsent+=nb;
00476 bf+=nb;
00477
00478
00479 if(nsent >= nBytes)
00480 {
00481 return 0;
00482 }
00483 }
00484 }
00485 }
00486
00487
00488
00489
00490 int CvsiTCPsocket::Receive(char* Buffer, int nBytes)
00491 {
00492
00493 if(m_Socket == VSI_INVALID_SOCKET)
00494 {
00495 return VSI_ERROR_SOCKET_NOT_OPEN;
00496 }
00497
00498
00499 int nb;
00500 int nrecv = 0;
00501 char* bf = Buffer;
00502
00503
00504
00505 while(1)
00506 {
00507 nb = recv ( m_Socket, bf, nBytes-nrecv, MSG_NOSIGNAL );
00508
00509 if(nb <= 0)
00510 {
00511 Rioperror("CvsiTCPsocket::Receive()");
00512
00513 return VSI_ERROR_SOCKET_RECV;
00514 }
00515 else
00516 {
00517 nrecv+=nb;
00518 bf+=nb;
00519
00520 if(nrecv >= nBytes)
00521 {
00522 return 0;
00523 }
00524 }
00525 }
00526
00527 return (0);
00528
00529 }
00530
00531
00532 u32 vsiGetIPaddress (char* HostName)
00533 {
00534 struct hostent* hostaddress;
00535 hostaddress = gethostbyname(HostName);
00536
00537 if(hostaddress == 0)
00538 {
00539 return 0;
00540 }
00541
00542 u32 result;
00543
00544 struct sockaddr_in RemoteAddress;
00545 memset( &RemoteAddress,0x00,sizeof( RemoteAddress ) );
00546 memcpy ((char*)&RemoteAddress.sin_addr,
00547 hostaddress->h_addr_list[0],
00548 hostaddress->h_length);
00549
00550 result = RemoteAddress.sin_addr.s_addr;
00551
00552 return result;
00553 }