blob: 1ffc775359e401879c6698daf3b981159538e93e [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "aos/common/network/Socket.h"
2
3#include <string.h>
4#include <errno.h>
5
Brian Silvermana9cbe302013-03-12 18:41:44 -07006#include "aos/common/logging/logging.h"
brians343bc112013-02-10 01:53:46 +00007#include "aos/common/network/SocketLibraries.h"
8
9namespace aos {
10
11int Socket::Connect(NetworkPort port, const char *address, int type) {
12 last_ret_ = 0;
Brian Silvermana9cbe302013-03-12 18:41:44 -070013 if ((socket_ = socket(AF_INET, type, 0)) < 0) {
14 LOG(ERROR, "failed to create socket because of %d: %s\n",
15 errno, strerror(errno));
brians343bc112013-02-10 01:53:46 +000016 return last_ret_ = 1;
Brian Silvermana9cbe302013-03-12 18:41:44 -070017 }
brians343bc112013-02-10 01:53:46 +000018
Brian Silvermana9cbe302013-03-12 18:41:44 -070019 memset(&addr_, 0, sizeof(addr_));
20 addr_.in.sin_family = AF_INET;
brians343bc112013-02-10 01:53:46 +000021 addr_.in.sin_port = htons(static_cast<uint16_t>(port));
22#ifndef __VXWORKS__
23 const int failure_return = 0;
24#else
25 const int failure_return = -1;
26#endif
Brian Silvermana9cbe302013-03-12 18:41:44 -070027 if (inet_aton(lame_unconst(address), &addr_.in.sin_addr) == failure_return) {
28 LOG(ERROR, "Invalid IP address '%s' because of %d: %s\n", address,
brians343bc112013-02-10 01:53:46 +000029 errno, strerror(errno));
30 return last_ret_ = -1;
Brian Silvermana9cbe302013-03-12 18:41:44 -070031 }
brians343bc112013-02-10 01:53:46 +000032
33 return last_ret_ = 0;
34}
35Socket::Socket() : socket_(-1), last_ret_(2) {}
36Socket::~Socket() {
Brian Silvermana9cbe302013-03-12 18:41:44 -070037 close(socket_);
brians343bc112013-02-10 01:53:46 +000038}
39
40void Socket::Reset() {
41 if (socket_ != -1) {
42 close(socket_);
43 socket_ = -1;
44 }
45 last_ret_ = 0;
46}
47
48int Socket::Recv(void *buf, int length) {
Brian Silvermana9cbe302013-03-12 18:41:44 -070049 const int ret = recv(socket_, static_cast<char *>(buf), length, 0);
brians343bc112013-02-10 01:53:46 +000050 last_ret_ = (ret == -1) ? -1 : 0;
51 return ret;
52}
53int Socket::Recv(void *buf, int length, long usec) {
54 timeval tv;
55 tv.tv_sec = 0;
56 tv.tv_usec = usec;
57 fd_set fds;
58 FD_ZERO(&fds);
59 FD_SET(socket_, &fds);
60 switch (select(FD_SETSIZE, &fds, NULL, NULL, &tv)) {
61 case 1:
62 return Recv(buf, length);
63 case 0:
64 return last_ret_ = 0;
65 default:
66 perror("select on socket to receive from failed");
67 return last_ret_ = -1;
68 }
69}
70int Socket::Send(const void *buf, int length) {
Brian Silvermana9cbe302013-03-12 18:41:44 -070071 const int ret = write(socket_,
brians343bc112013-02-10 01:53:46 +000072 lame_unconst(static_cast<const char *>(buf)), length);
brians343bc112013-02-10 01:53:46 +000073 last_ret_ = (ret == -1) ? -1 : 0;
74 return ret;
75}
76
Brian Silvermana9cbe302013-03-12 18:41:44 -070077} // namespace aos