00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "mxsocket.h"
00018
00019
00020 namespace mx
00021 {
00022
00023
00024 mxSocket::mxSocket()
00025 {
00026 current_socket = 0;
00027 connected = false;
00028 }
00029
00030 mxSocket::~mxSocket()
00031 {
00032
00033 }
00034
00035 mxSocket::mxSocket(mx_socket nsock)
00036 {
00037 current_socket = nsock;
00038 connected = true;
00039 }
00040
00041 mxSocket::mxSocket(const mxSocket &nsock)
00042 {
00043 current_socket = nsock.current_socket;
00044 connected = nsock.connected;
00045 }
00046
00047 mxSocket& mxSocket::operator=(const mxSocket &sock)
00048 {
00049
00050 current_socket = sock.current_socket;
00051 connected = sock.connected;
00052 return *this;
00053 }
00054
00055 bool mxSocket::createSocket()
00056 {
00057
00058 current_socket = socket(AF_INET,SOCK_STREAM,0);
00059 return true;
00060 }
00061
00062 bool mxSocket::listenAt(int port)
00063 {
00064
00065 static struct sockaddr_in addy;
00066 memset((char*)&addy,0, sizeof(addy));
00067 addy.sin_port = htons(port);
00068 addy.sin_family = AF_INET;
00069 addy.sin_addr.s_addr = INADDR_ANY;
00070 int yup = 1;
00071
00072 setsockopt(current_socket, SOL_SOCKET,SO_REUSEADDR,(const char*)&yup,sizeof(yup));
00073
00074 bind(current_socket, (struct sockaddr *)&addy, sizeof(addy));
00075 listen(current_socket,5);
00076
00077 return true;
00078 }
00079
00080
00081 mx_socket mxSocket::acceptNewSocket(std::string &ip)
00082 {
00083 #ifdef _WIN32
00084 int caddy_len;
00085 #else
00086 socklen_t caddy_len;
00087 #endif
00088 static struct sockaddr_in caddy;
00089 int s;
00090 s = accept(current_socket, (struct sockaddr *)&caddy, &caddy_len);
00091 ip = std::string(inet_ntoa(caddy.sin_addr));
00092 connected = true;
00093 return s;
00094 }
00095
00096 mx_socket mxSocket::acceptsocket()
00097 {
00098 #ifdef _WIN32
00099 int caddy_len;
00100 #else
00101 socklen_t caddy_len;
00102 #endif
00103
00104 mx_socket SOCK;
00105 struct sockaddr_in caddy;
00106 SOCK = accept(current_socket, (struct sockaddr *)&caddy, &caddy_len);
00107 connected = true;
00108 return SOCK;
00109 }
00110
00111
00112 bool mxSocket::connectTo(std::string where, unsigned int port)
00113 {
00114 struct sockaddr_in saddy;
00115 saddy.sin_port = htons(port);
00116 saddy.sin_addr.s_addr = inet_addr(where.c_str());
00117 saddy.sin_family = AF_INET;
00118
00119 if(connect(current_socket, (const sockaddr*)&saddy, sizeof(sockaddr_in)) == -1) {
00120
00121 std::cout << "error: could not connect: \n";
00122 return false;
00123 }
00124
00125 connected = true;
00126 return true;
00127 }
00128
00129
00130 ssize_t mxSocket::Read(void *data, size_t size)
00131 {
00132
00133 size_t len = size;
00134 size_t total = 0;
00135 int cur_;
00136 char *cdata = (char*)data;
00137
00138 while ( (len != 0) && ( (cur_ = recv(current_socket, cdata, len, 0) ) != 0) )
00139 {
00140
00141 if(cur_ == -1) {
00142
00143
00144 std::cerr << "mxsocket: error on read\n";
00145 return -1;
00146
00147 }
00148 len -= cur_;
00149 cdata += cur_;
00150 total += cur_;
00151 }
00152
00153 return total;
00154
00155 }
00156
00157 ssize_t mxSocket::Write(void *data, size_t size)
00158 {
00159
00160 size_t len = size;
00161 size_t total = 0;
00162 int cur_;
00163 char *cdata = (char*)data;
00164
00165 while ( (len != 0) && (( cur_ = send(current_socket, cdata, len, 0) ) != 0) )
00166 {
00167
00168 if(cur_ == -1) {
00169
00170
00171 std::cerr << "mxsocket: error on write\n";
00172 return -1;
00173
00174 }
00175 len -= cur_;
00176 cdata += cur_;
00177 total += cur_;
00178 }
00179
00180 return total;
00181 }
00182
00183
00184 int mxSocket::closeSocket()
00185 {
00186
00187 #ifdef _WIN32
00188 return closesocket(current_socket);
00189 #else
00190 return close(current_socket);
00191 #endif
00192 return 1;
00193
00194 }
00195
00196
00197 }
00198
00199
00200
00201