#include <localsocket.hh>
Inheritance diagram for Network::LocalSocket:
Public Member Functions | |
LocalSocket () | |
LocalSocket (PROTO_KIND pkind) | |
virtual | ~LocalSocket () |
void | writeto (const std::string &str, const std::string &filename) |
function used to send a msg to a specific named socket | |
std::string | read () |
function used by >> operator (read a string on current socket) | |
std::string | read (int timeout) |
read a string with a timeout | |
std::string | read (std::string &filename) |
read a string and put the client named socket name in filename | |
std::string | read (std::string &filename, int timeout) |
read a string and put the client named socket name in filename with a timeout | |
std::string | readn (unsigned int size) |
read a string from socket | |
std::string | readn (int timeout, unsigned int size) |
read a string with a timeout | |
std::string | readn (std::string &filename, unsigned int size) |
read a string and put the client named socket name in filename | |
std::string | readn (std::string &filename, int timeout, unsigned int size) |
read a string and put the client named socket name in filename with a timeout | |
void | init (const std::string &filename) |
Initialize a local socket (server). | |
void | close () |
connect to a local socket (client) | |
Protected Member Functions | |
int | _bind (const std::string &filename) |
Initialize a local socket connection (server in UDP) create a named socket with name filename. | |
std::string | _read_line (int socket) |
Get a line from socket (when used with textual protocol). | |
std::string | _read_line (int socket, std::string &filename) |
Get a line from socket and give client socket filename (for named socket) (when used with textual protocol). | |
std::string | _read_line_bin (int socket, unsigned int size) |
Get a line from socket (when used with binary protocol). | |
std::string | _read_line_bin (int socket, std::string &filename, unsigned int pkg_size) |
Get a line from socket and give client socket filename (for named socket) (when used with binary protocol). | |
void | _write_str (int socket, const std::string &str, const std::string &filename) const |
Write a string to a socket to a particular named socket (when used with textual protocol). | |
void | _write_str_bin (int socket, const std::string &str, const std::string &filename) const |
Write a string to a socket to a particular named socket (when used with binary protocol). | |
Protected Attributes | |
std::string | _filename |
Definition at line 34 of file localsocket.hh.
|
Definition at line 37 of file localsocket.hh. References _filename, and Network::LOCAL. 00037 : 00038 Socket(LOCAL), _filename("") 00039 {} LocalSocket(PROTO_KIND pkind) :
|
|
Definition at line 40 of file localsocket.hh. References _filename, and Network::LOCAL.
|
|
Definition at line 44 of file localsocket.hh. References close(). 00045 { 00046 close(); 00047 }
|
|
Initialize a local socket connection (server in UDP) create a named socket with name filename.
Definition at line 48 of file localsocket.cc. References HERE. Referenced by init(). 00049 { 00050 int s; 00051 struct sockaddr_un name; 00052 size_t size; 00053 00054 s = socket(PF_UNIX, SOCK_DGRAM, 0); 00055 if (s < 0) 00056 throw NoConnection("Socket error", HERE); 00057 name.sun_family = AF_UNIX; 00058 strncpy(name.sun_path, filename.c_str(), sizeof (name.sun_path)); 00059 name.sun_path[sizeof (name.sun_path) - 1] = '\0'; 00060 size = (offsetof (struct sockaddr_un, sun_path) 00061 + strlen (name.sun_path) + 1); 00062 if (bind (s, (struct sockaddr *) &name, size) < 0) 00063 throw BindError("Bind error", HERE); 00064 return s; 00065 }
|
|
Get a line from socket and give client socket filename (for named socket) (when used with textual protocol).
Definition at line 119 of file localsocket.cc. References Network::Socket::_update_buffer(), and HERE. 00121 { 00122 char chr[MAXPKTSIZE]; 00123 std::string str = ""; 00124 int res = 1, i; 00125 std::pair<int, int> delim; 00126 struct sockaddr_un addr; 00127 size_t size; 00128 bool end = false; 00129 00130 size = sizeof(addr); 00131 if (socket < 0) 00132 throw NoConnection("No Socket", HERE); 00133 if (!_update_buffer(delim, i, str)) 00134 while (!end) 00135 { 00136 #ifdef __CYGWIN__ 00137 res = recvfrom(socket, chr, MAXPKTSIZE, 0, 00138 (struct sockaddr*)&addr, 00139 (socklen_t*)&size); 00140 #else 00141 res = recvfrom(socket, chr, MAXPKTSIZE, MSG_TRUNC, 00142 (struct sockaddr*)&addr, 00143 (socklen_t*)&size); 00144 #endif 00145 if (res <= 0) 00146 throw ConnectionClosed("Connection Closed", HERE); 00147 _buffer += std::string(chr, res); 00148 if (_update_buffer(delim, i, str)) 00149 end = true; 00150 } 00151 filename = std::string(addr.sun_path); 00152 _state_timeout = 0; 00153 return str; 00154 }
|
|
Get a line from socket (when used with textual protocol).
Implements Network::Socket. Definition at line 211 of file localsocket.cc. References Network::Socket::_update_buffer(), and HERE. Referenced by read(). 00212 { 00213 char chr[MAXPKTSIZE]; 00214 std::string str = ""; 00215 int res = 1, i; 00216 std::pair<int, int> delim; 00217 bool end = false; 00218 00219 if (socket < 0) 00220 throw NoConnection("No Socket", HERE); 00221 if (!_update_buffer(delim, i, str)) 00222 while (!end) 00223 { 00224 memset(chr, 0, MAXPKTSIZE); 00225 #ifdef __CYGWIN__ 00226 res = recv(socket, chr, MAXPKTSIZE, 0); 00227 #else 00228 res = recv(socket, chr, MAXPKTSIZE, MSG_TRUNC); 00229 #endif 00230 if (res <= 0) 00231 throw ConnectionClosed("Connection Closed", HERE); 00232 _buffer += std::string(chr, res); 00233 if (_update_buffer(delim, i, str)) 00234 end = true; 00235 } 00236 _state_timeout = 0; 00237 return str; 00238 }
|
|
Get a line from socket and give client socket filename (for named socket) (when used with binary protocol).
Definition at line 240 of file localsocket.cc. References HERE. 00243 { 00244 char chr[MAXPKTSIZE]; 00245 std::string str = ""; 00246 int res = 1; 00247 struct sockaddr_un addr; 00248 size_t size; 00249 bool end = false; 00250 00251 size = sizeof(addr); 00252 if (socket < 0) 00253 throw NoConnection("No Socket", HERE); 00254 if (_buffer.size() >= 2 && !pkg_size) 00255 { 00256 pkg_size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1]; 00257 _buffer = _buffer.substr(2, _buffer.size() - 2); 00258 } 00259 if (pkg_size && _buffer.size() >= pkg_size) 00260 { 00261 str = _buffer.substr(0, pkg_size); 00262 _buffer = _buffer.substr(pkg_size, _buffer.size() - pkg_size); 00263 } 00264 else 00265 while (!end) 00266 { 00267 #ifdef __CYGWIN__ 00268 res = recvfrom(socket, chr, MAXPKTSIZE, 0, 00269 (struct sockaddr*)&addr, 00270 (socklen_t*)&size); 00271 #else 00272 res = recvfrom(socket, chr, MAXPKTSIZE, MSG_TRUNC, 00273 (struct sockaddr*)&addr, 00274 (socklen_t*)&size); 00275 #endif 00276 if (res <= 0) 00277 throw ConnectionClosed("Connection Closed", HERE); 00278 // _buffer += all octets received 00279 _buffer += std::string(chr, res).substr(0, res); 00280 if (!pkg_size) 00281 { 00282 // extract size from _buffer and reduce it 00283 pkg_size = (unsigned char)_buffer[0] * 256 + 00284 (unsigned char)_buffer[1]; 00285 _buffer = _buffer.substr(2, _buffer.size() - 2); 00286 } 00287 if (_buffer.size() > pkg_size - str.size()) 00288 { 00289 str += _buffer.substr(0, pkg_size - str.size()); 00290 _buffer = _buffer.substr(pkg_size - str.size(), 00291 _buffer.size() - pkg_size - str.size()); 00292 } 00293 else 00294 { 00295 str += _buffer; 00296 _buffer = ""; 00297 } 00298 if (str.size() >= pkg_size) 00299 end = true; 00300 } 00301 filename = std::string(addr.sun_path); 00302 return str; 00303 }
|
|
Get a line from socket (when used with binary protocol).
Implements Network::Socket. Definition at line 156 of file localsocket.cc. References HERE. Referenced by read(), and readn(). 00157 { 00158 char chr[MAXPKTSIZE]; 00159 std::string str = ""; 00160 int res = 1; 00161 bool end = false; 00162 00163 if (socket < 0) 00164 throw NoConnection("No Socket", HERE); 00165 if (_buffer.size() >= 2 && !size) 00166 { 00167 size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1]; 00168 _buffer = _buffer.substr(2, _buffer.size() - 2); 00169 } 00170 if (size && _buffer.size() >= size) 00171 { 00172 str = _buffer.substr(0, size); 00173 _buffer = _buffer.substr(size, _buffer.size() - size); 00174 } 00175 else 00176 while (!end) 00177 { 00178 memset(chr, 0, MAXPKTSIZE); 00179 #ifdef __CYGWIN__ 00180 res = recv(socket, chr, MAXPKTSIZE, 0); 00181 #else 00182 res = recv(socket, chr, MAXPKTSIZE, MSG_TRUNC); 00183 #endif 00184 if (res <= 0) 00185 throw ConnectionClosed("Connection Closed", HERE); 00186 // _buffer += all octets received 00187 _buffer += std::string(chr, res); 00188 if (!size) 00189 { 00190 // extract size from _buffer and reduce it 00191 size = (unsigned char)_buffer[0] * 256 + (unsigned char)_buffer[1]; 00192 _buffer = _buffer.substr(2, _buffer.size() - 2); 00193 } 00194 if (_buffer.size() > size - str.size()) 00195 { 00196 str += _buffer.substr(0, size - str.size()); 00197 _buffer = _buffer.substr(size - str.size(), 00198 _buffer.size() - size - str.size()); 00199 } 00200 else 00201 { 00202 str += _buffer; 00203 _buffer = ""; 00204 } 00205 if (str.size() >= size) 00206 end = true; 00207 } 00208 return str; 00209 }
|
|
Write a string to a socket to a particular named socket (when used with textual protocol).
Definition at line 67 of file localsocket.cc. References HERE, and SENDTO_FLAGS. Referenced by writeto(). 00069 { 00070 int res = 1; 00071 const char *buf = str.c_str(); 00072 unsigned int count = 0; 00073 struct sockaddr_un name; 00074 00075 name.sun_family = AF_UNIX; 00076 strncpy(name.sun_path, filename.c_str(), sizeof (name.sun_path)); 00077 name.sun_path[sizeof (name.sun_path) - 1] = '\0'; 00078 00079 if (socket < 0) 00080 throw NoConnection("No Socket", HERE); 00081 while (res && count < str.size()) 00082 { 00083 res = sendto(socket, buf + count, 00084 str.size() - count, SENDTO_FLAGS, 00085 (const struct sockaddr*)&name, sizeof(name)); 00086 if (res <= 0) 00087 throw ConnectionClosed("Connection Closed", HERE); 00088 count += res; 00089 } 00090 }
|
|
Write a string to a socket to a particular named socket (when used with binary protocol).
Definition at line 92 of file localsocket.cc. References HERE, and SENDTO_FLAGS. Referenced by writeto(). 00094 { 00095 int res = 1; 00096 unsigned int count = 0; 00097 struct sockaddr_un name; 00098 char buf[str.size() + 2]; 00099 00100 buf[0] = str.size() / 256; 00101 buf[1] = str.size() % 256; 00102 memcpy(buf + 2, str.c_str(), str.size()); 00103 name.sun_family = AF_UNIX; 00104 strncpy(name.sun_path, filename.c_str(), sizeof (name.sun_path)); 00105 name.sun_path[sizeof (name.sun_path) - 1] = DEFAULT_DELIM; 00106 00107 if (socket < 0) 00108 throw NoConnection("No Socket", HERE); 00109 while (res && count < str.size() + 2) 00110 { 00111 res = sendto(socket, buf + count, str.size() + 2 - count, SENDTO_FLAGS, 00112 (const struct sockaddr*)&name, sizeof(name)); 00113 if (res <= 0) 00114 throw ConnectionClosed("Connection Closed", HERE); 00115 count += res; 00116 } 00117 }
|
|
connect to a local socket (client)
Definition at line 39 of file localsocket.cc. References Network::Socket::_close(), and _filename. Referenced by ~LocalSocket(). 00040 {
00041 if (_socket > 0)
00042 _close(_socket);
00043 _socket = 0;
00044 unlink(_filename.c_str());
00045 _filename = "";
00046 }
|
|
Initialize a local socket (server).
#include <stdlib.h> #include <iostream> #include <string> #include "socket/localsocket.hh"
int main(int argc, char **argv) { Network::LocalSocket server; std::string filename, client, str("");
if (argc < 2) { std::cout << "Use: " << argv[0] << " filename" << std::endl; exit(0); } try { filename = std::string(argv[1]); server.init(filename); while (str != "quit") { //server.read(filename 30); //read with a timeout of 30 seconds //server >> str; //read without geting the named name //(cannot sent data) str = server.read(client); std::string msg = "ok, I received [" + str + "]"; server.writeto(msg, client); std::cout << "[" << str << "] from : " << client << std::endl; } server.close(); exit (0); } catch (Network::Timeout e) { std::cerr << e; std::cerr << "No connection during last 30s, closing connection" << std::endl; exit (1); } catch (Network::Exception e) { std::cerr << e; exit(1); } }
Here is an example of named server server using libsocket : #include <stdlib.h> #include <iostream> #include <string> #include "socket/localsocket.hh"
int main(int argc, char **argv) { Network::LocalSocket client; std::string client_filename, server_filename, str(""), msg;
if (argc < 3) { std::cout << "Use: " << argv[0] << " <client_filename> " << "<server_filename>" << std::endl; exit(0); } try { client_filename = std::string(argv[1]); server_filename = std::string(argv[2]);
client.init(client_filename); while (str != "quit") { std::cout << "Msg: "; std::cin >> str; client.writeto(str, server_filename); client >> msg; std::cout << "[received] " << msg << std::endl; } client.close(); exit (0); } catch (Network::Timeout e) { std::cerr << e; std::cerr << "No connection during last 30s, closing connection" << std::endl; exit (1); } catch (Network::Exception e) { std::cerr << e; exit(1); } }
Definition at line 33 of file localsocket.cc. References _bind(), and _filename.
|
|
read a string and put the client named socket name in filename with a timeout
Definition at line 381 of file localsocket.cc. References _read_line(), _read_line_bin(), Network::Socket::_set_timeout(), and Network::binary. 00382 { 00383 if (_proto_kind == binary) 00384 { 00385 _set_timeout(true, _socket, timeout); 00386 return _read_line_bin(_socket, filename, 0); 00387 } 00388 else 00389 { 00390 _state_timeout = timeout; 00391 return _read_line(_socket, filename); 00392 } 00393 }
|
|
read a string and put the client named socket name in filename
Definition at line 373 of file localsocket.cc. References _read_line(), and _read_line_bin(). 00374 {
00375 if (_proto_kind)
00376 return _read_line_bin(_socket, filename, 0);
00377 else
00378 return _read_line(_socket, filename);
00379 }
|
|
read a string with a timeout
Implements Network::Socket. Definition at line 359 of file localsocket.cc. References _read_line(), _read_line_bin(), Network::Socket::_set_timeout(), and Network::binary. 00360 { 00361 if (_proto_kind == binary) 00362 { 00363 _set_timeout(true, _socket, timeout); 00364 return _read_line_bin(_socket, 0); 00365 } 00366 else 00367 { 00368 _state_timeout = timeout; 00369 return _read_line(_socket); 00370 } 00371 }
|
|
function used by >> operator (read a string on current socket)
Implements Network::Socket. Definition at line 351 of file localsocket.cc. References _read_line(), _read_line_bin(), and Network::binary. 00352 {
00353 if (_proto_kind == binary)
00354 return _read_line_bin(_socket, 0);
00355 else
00356 return _read_line(_socket);
00357 }
|
|
read a string and put the client named socket name in filename with a timeout
Definition at line 340 of file localsocket.cc. References _read_line_bin(), and Network::Socket::_set_timeout(). 00342 { 00343 if (!size || size > _buffer.size()) 00344 _set_timeout(true, _socket, timeout); 00345 // _read_line_bin is bufferised with the same buffer as textual 00346 // protocols, so this function can be used for binary and text 00347 // protocols. 00348 return _read_line_bin(_socket, filename, size); 00349 }
|
|
read a string and put the client named socket name in filename
Definition at line 332 of file localsocket.cc. References _read_line_bin(). 00333 { 00334 // _read_line_bin is bufferised with the same buffer as textual 00335 // protocols, so this function can be used for binary and text 00336 // protocols. 00337 return _read_line_bin(_socket, filename, size); 00338 }
|
|
read a string with a timeout
Implements Network::Socket. Definition at line 322 of file localsocket.cc. References _read_line_bin(), and Network::Socket::_set_timeout(). 00323 { 00324 if (!size || size > _buffer.size()) 00325 _set_timeout(true, _socket, timeout); 00326 // _read_line_bin is bufferised with the same buffer as textual 00327 // protocols, so this function can be used for binary and text 00328 // protocols. 00329 return _read_line_bin(_socket, size); 00330 }
|
|
read a string from socket
Implements Network::Socket. Definition at line 314 of file localsocket.cc. References _read_line_bin(). 00315 { 00316 // _read_line_bin is bufferised with the same buffer as textual 00317 // protocols, so this function can be used for binary and text 00318 // protocols. 00319 return _read_line_bin(_socket, size); 00320 }
|
|
function used to send a msg to a specific named socket
Definition at line 305 of file localsocket.cc. References _write_str(), _write_str_bin(), and Network::binary. 00307 {
00308 if (_proto_kind == binary)
00309 _write_str_bin(_socket, str, filename);
00310 else
00311 _write_str(_socket, str, filename);
00312 }
|
|
Definition at line 224 of file localsocket.hh. Referenced by close(), init(), and LocalSocket(). |