4 #if defined(__HAIKU__) || defined(HAIKU_TARGET_PLATFORM_BONE)
5 # include <sys/socket.h>
7 # include <net/socket.h>
10 #include <arpa/inet.h>
17 #include "SocketStream.h"
20 #define INADDR_NONE 0xffffffff
25 Socket::Socket(const char *host
, int port
)
26 : __sock(-1), __is(NULL
), __os(NULL
), __error(false)
31 __error_msg
[0] = '\0';
36 Socket::Socket(const char *host
, int port
, int localPort
)
37 : __sock(-1), __is(NULL
), __os(NULL
), __error(false)
41 __localPort
= localPort
;
42 __error_msg
[0] = '\0';
58 istream
&Socket::getInputStream()
61 __is
= new isocketstream(this);
66 ostream
&Socket::getOutputStream()
69 __os
= new osocketstream(this);
76 if (__sock
== -1 && !__error
) {
79 memset(&sin
, 0, sizeof(sin
));
84 if ((inaddr
= inet_addr(__host
.c_str())) != INADDR_NONE
) {
85 memcpy(&sin
.sin_addr
, &inaddr
, sizeof(inaddr
));
86 sin
.sin_family
= AF_INET
;
87 } else if ((host_info
= gethostbyname(__host
.c_str())) != NULL
) {
88 memcpy(&sin
.sin_addr
, host_info
->h_addr
, host_info
->h_length
);
89 sin
.sin_family
= host_info
->h_addrtype
;
91 sprintf(__error_msg
, "gethostbyname failed. errno = %d", errno
);
96 if ((__sock
= socket(AF_INET
, SOCK_STREAM
, 0)) == -1) {
97 sprintf(__error_msg
, "socket failed. errno = %d", errno
);
100 if (__localPort
>= 0) {
102 memset(&cin
, 0, sizeof(cin
));
103 cin
.sin_family
= AF_INET
;
104 cin
.sin_port
= htons(__localPort
);
105 if (::bind(__sock
, (sockaddr
*)&cin
, sizeof(cin
)) != 0) {
106 sprintf(__error_msg
, "bind failed. errno = %d", errno
);
112 sin
.sin_port
= htons(__port
);
113 if (::connect(__sock
, (sockaddr
*)&(sin
), sizeof(sin
)) != 0) {
114 sprintf(__error_msg
, "connect failed. errno = %d", errno
);
126 ::shutdown(__sock
, 2);
132 bool Socket::fail() const
134 return __sock
== -1 || __error
;
137 bool Socket::good() const
142 bool Socket::operator !() const
147 int Socket::read(char *buffer
, int size
, int flags
)
152 size
= ::recv(__sock
, buffer
, size
, flags
);
154 sprintf(__error_msg
, "recv failed. errno = %d", errno
);
162 int Socket::write(const char *buffer
, int size
, int flags
)
167 size
= ::send(__sock
, buffer
, size
, flags
);
169 sprintf(__error_msg
, "send failed. errno = %d", errno
);