ABY Framework  1.0
Arithmetic Bool Yao Framework
 All Classes Files Functions Variables Enumerations Enumerator Macros
socket.h
Go to the documentation of this file.
1 
19 #ifndef __SOCKET_H__BY_SGCHOI
20 #define __SOCKET_H__BY_SGCHOI
21 
22 #include "typedefs.h"
23 
24 class CSocket {
25 public:
26  CSocket() {
27  m_hSock = INVALID_SOCKET;
28  }
29  ~CSocket() {
30  //Close();
31  }
32 
33 public:
34  BOOL Socket() {
35  BOOL success = false;
36  BOOL bOptVal = true;
37  int bOptLen = sizeof(BOOL);
38 
39 #ifdef WIN32
40  static BOOL s_bInit = FALSE;
41 
42  if (!s_bInit) {
43  WORD wVersionRequested;
44  WSADATA wsaData;
45 
46  wVersionRequested = MAKEWORD(2, 0);
47  WSAStartup(wVersionRequested, &wsaData);
48  s_bInit = TRUE;
49  }
50 #endif
51 
52  Close();
53 
54  success = (m_hSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET;
55 
56  return success;
57 
58  }
59 
60  void Close() {
61  if (m_hSock == INVALID_SOCKET)
62  return;
63 
64 #ifdef WIN32
65  shutdown(m_hSock, SD_SEND);
66  closesocket(m_hSock);
67 #else
68  shutdown(m_hSock, SHUT_WR);
69  close(m_hSock);
70 #endif
71 
72  m_hSock = INVALID_SOCKET;
73  }
74 
75  void AttachFrom(CSocket& s) {
76  m_hSock = s.m_hSock;
77  }
78 
79  void Detach() {
80  m_hSock = INVALID_SOCKET;
81  }
82 
83 public:
84  string GetIP() {
85  sockaddr_in addr;
86  UINT addr_len = sizeof(addr);
87 
88  if (getsockname(m_hSock, (sockaddr *) &addr, (socklen_t *) &addr_len) < 0)
89  return "";
90  return inet_ntoa(addr.sin_addr);
91  }
92 
93  USHORT GetPort() {
94  sockaddr_in addr;
95  UINT addr_len = sizeof(addr);
96 
97  if (getsockname(m_hSock, (sockaddr *) &addr, (socklen_t *) &addr_len) < 0)
98  return 0;
99  return ntohs(addr.sin_port);
100  }
101 
102  BOOL Bind(USHORT nPort = 0, string ip = "") {
103  // Bind the socket to its port
104  sockaddr_in sockAddr;
105  memset(&sockAddr, 0, sizeof(sockAddr));
106  sockAddr.sin_family = AF_INET;
107 
108  if (ip != "") {
109  int on = 1;
110  setsockopt(m_hSock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof(on));
111 
112  sockAddr.sin_addr.s_addr = inet_addr(ip.c_str());
113 
114  if (sockAddr.sin_addr.s_addr == INADDR_NONE) {
115  hostent* phost;
116  phost = gethostbyname(ip.c_str());
117  if (phost != NULL)
118  sockAddr.sin_addr.s_addr = ((in_addr*) phost->h_addr)->s_addr;
119  else
120  return FALSE;
121  }
122  }
123  else
124  {
125  sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
126  }
127 
128  sockAddr.sin_port = htons(nPort);
129 
130  return bind(m_hSock, (sockaddr *) &sockAddr, sizeof(sockaddr_in)) >= 0;
131  }
132 
133  BOOL Listen(int nQLen = 5) {
134  return listen(m_hSock, nQLen) >= 0;
135  }
136 
137  BOOL Accept(CSocket& sock) {
138  sock.m_hSock = accept(m_hSock, NULL, 0);
139  if (sock.m_hSock == INVALID_SOCKET)
140  return FALSE;
141 
142  return TRUE;
143  }
144 
145  BOOL Connect(string ip, USHORT port, LONG lTOSMilisec = -1) {
146  sockaddr_in sockAddr;
147  memset(&sockAddr, 0, sizeof(sockAddr));
148  sockAddr.sin_family = AF_INET;
149  sockAddr.sin_addr.s_addr = inet_addr(ip.c_str());
150 
151  if (sockAddr.sin_addr.s_addr == INADDR_NONE) {
152  hostent* lphost;
153  lphost = gethostbyname(ip.c_str());
154  if (lphost != NULL)
155  sockAddr.sin_addr.s_addr = ((in_addr*) lphost->h_addr)->s_addr;
156  else
157  return FALSE;
158  }
159 
160  sockAddr.sin_port = htons(port);
161 
162 #ifdef WIN32
163 
164  DWORD dw = 100000;
165 
166  if( lTOSMilisec > 0 )
167  {
168  setsockopt(m_hSock, SOL_SOCKET, SO_RCVTIMEO, (char*) &lTOSMilisec, sizeof(lTOSMilisec));
169  }
170 
171  int ret = connect(m_hSock, (sockaddr*)&sockAddr, sizeof(sockAddr));
172 
173  if( ret >= 0 && lTOSMilisec > 0 )
174  setsockopt(m_hSock, SOL_SOCKET, SO_RCVTIMEO, (char*) &dw, sizeof(dw));
175 
176 #else
177 
178  timeval tv;
179  socklen_t len;
180 
181  if (lTOSMilisec > 0) {
182  tv.tv_sec = lTOSMilisec / 1000;
183  tv.tv_usec = (lTOSMilisec % 1000) * 1000;
184 
185  setsockopt(m_hSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
186  }
187 
188  int ret = connect(m_hSock, (sockaddr*) &sockAddr, sizeof(sockAddr));
189 
190  if (ret >= 0 && lTOSMilisec > 0) {
191  tv.tv_sec = 100000;
192  tv.tv_usec = 0;
193 
194  setsockopt(m_hSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
195  }
196 
197 #endif
198  return ret >= 0;
199  }
200 
201  uint64_t Receive(void* pBuf, uint64_t nLen, int nFlags = 0) {
202  char* p = (char*) pBuf;
203  uint64_t n = nLen;
204  uint64_t ret = 0;
205  while (n > 0) {
206  ret = recv(m_hSock, p, n, 0);
207 #ifdef WIN32
208  if( ret <= 0 )
209  {
210  return ret;
211  }
212 #else
213  if (ret < 0) {
214  if ( errno == EAGAIN) {
215  cerr << "socket recv eror: EAGAIN" << endl;
216  SleepMiliSec(200);
217  continue;
218  } else {
219  cerr << "socket recv error: " << errno << endl;
220  perror("Socket error ");
221  return ret;
222  }
223  } else if (ret == 0) {
224  return ret;
225  }
226 #endif
227 
228  p += ret;
229  n -= ret;
230  }
231  return nLen;
232  }
233 
234  int Send(const void* pBuf, uint64_t nLen, int nFlags = 0) {
235  return send(m_hSock, (char*) pBuf, nLen, nFlags);
236  }
237 
238 private:
239  SOCKET m_hSock;
240 };
241 
242 #endif //SOCKET_H__BY_SGCHOI
243 
Definition: socket.h:24
Typedefs Implementation.