31 #include <sys/types.h>
32 #include <sys/socket.h>
35 #include <netinet/in.h>
36 #include <netinet/tcp.h>
37 #include <arpa/inet.h>
65 if ((flags = fcntl(fd, F_GETFL)) == -1) {
66 anetSetError(err,
"fcntl(F_GETFL): %s", strerror(errno));
69 if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) {
70 anetSetError(err,
"fcntl(F_SETFL,O_NONBLOCK): %s", strerror(errno));
79 if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes,
sizeof(yes)) == -1)
81 anetSetError(err,
"setsockopt TCP_NODELAY: %s", strerror(errno));
89 if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buffsize,
sizeof(buffsize)) == -1)
91 anetSetError(err,
"setsockopt SO_SNDBUF: %s", strerror(errno));
100 if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &yes,
sizeof(yes)) == -1) {
101 anetSetError(err,
"setsockopt SO_KEEPALIVE: %s", strerror(errno));
109 struct sockaddr_in sa;
111 sa.sin_family = AF_INET;
112 if (inet_aton(host, &sa.sin_addr) == 0) {
115 he = gethostbyname(host);
120 memcpy(&sa.sin_addr, he->h_addr,
sizeof(
struct in_addr));
122 strcpy(ipbuf,inet_ntoa(sa.sin_addr));
128 if ((s = socket(domain, SOCK_STREAM, 0)) == -1) {
129 anetSetError(err,
"creating socket: %s", strerror(errno));
135 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on,
sizeof(on)) == -1) {
136 anetSetError(err,
"setsockopt SO_REUSEADDR: %s", strerror(errno));
142 #define ANET_CONNECT_NONE 0
143 #define ANET_CONNECT_NONBLOCK 1
147 struct sockaddr_in sa;
152 sa.sin_family = AF_INET;
153 sa.sin_port = htons(port);
154 if (inet_aton(addr, &sa.sin_addr) == 0) {
157 he = gethostbyname(addr);
163 memcpy(&sa.sin_addr, he->h_addr,
sizeof(
struct in_addr));
169 if (connect(s, (
struct sockaddr*)&sa,
sizeof(sa)) == -1) {
170 if (errno == EINPROGRESS &&
171 flags & ANET_CONNECT_NONBLOCK)
194 struct sockaddr_un sa;
199 sa.sun_family = AF_LOCAL;
200 strncpy(sa.sun_path,path,
sizeof(sa.sun_path)-1);
205 if (connect(s,(
struct sockaddr*)&sa,
sizeof(sa)) == -1) {
206 if (errno == EINPROGRESS &&
207 flags & ANET_CONNECT_NONBLOCK)
231 int nread, totlen = 0;
232 while(totlen != count) {
233 nread = read(fd,buf,count-totlen);
234 if (nread == 0)
return totlen;
235 if (nread == -1)
return -1;
246 int nwritten, totlen = 0;
247 while(totlen != count) {
248 nwritten = write(fd,buf,count-totlen);
249 if (nwritten == 0)
return totlen;
250 if (nwritten == -1)
return -1;
257 static int anetListen(
char *err,
int s,
struct sockaddr *sa, socklen_t len) {
258 if (bind(s,sa,len) == -1) {
267 if (listen(s, 511) == -1) {
278 struct sockaddr_in sa;
283 memset(&sa,0,
sizeof(sa));
284 sa.sin_family = AF_INET;
285 sa.sin_port = htons(port);
286 sa.sin_addr.s_addr = htonl(INADDR_ANY);
287 if (bindaddr && inet_aton(bindaddr, &sa.sin_addr) == 0) {
300 struct sockaddr_un sa;
305 memset(&sa,0,
sizeof(sa));
306 sa.sun_family = AF_LOCAL;
307 strncpy(sa.sun_path,path,
sizeof(sa.sun_path)-1);
311 chmod(sa.sun_path, perm);
318 fd = accept(s,sa,len);
334 struct sockaddr_in sa;
335 socklen_t salen =
sizeof(sa);
339 if (ip) strcpy(ip,inet_ntoa(sa.sin_addr));
340 if (port) *port = ntohs(sa.sin_port);
346 struct sockaddr_un sa;
347 socklen_t salen =
sizeof(sa);
355 struct sockaddr_in sa;
356 socklen_t salen =
sizeof(sa);
358 if (getpeername(fd,(
struct sockaddr*)&sa,&salen) == -1) {
364 if (ip) strcpy(ip,inet_ntoa(sa.sin_addr));
365 if (port) *port = ntohs(sa.sin_port);
370 struct sockaddr_in sa;
371 socklen_t salen =
sizeof(sa);
373 if (getsockname(fd,(
struct sockaddr*)&sa,&salen) == -1) {
379 if (ip) strcpy(ip,inet_ntoa(sa.sin_addr));
380 if (port) *port = ntohs(sa.sin_port);
int anetTcpServer(char *err, int port, char *bindaddr)
int anetUnixGenericConnect(char *err, char *path, int flags)
int anetTcpConnect(char *err, char *addr, int port)
#define ANET_CONNECT_NONE
int anetSockName(int fd, char *ip, int *port)
int anetTcpNoDelay(char *err, int fd)
int anetTcpKeepAlive(char *err, int fd)
static int anetTcpGenericConnect(char *err, char *addr, int port, int flags)
int anetRead(int fd, char *buf, int count)
int anetUnixAccept(char *err, int s)
int anetPeerToString(int fd, char *ip, int *port)
static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len)
#define ANET_CONNECT_NONBLOCK
int anetSetSendBuffer(char *err, int fd, int buffsize)
static int anetCreateSocket(char *err, int domain)
int anetResolve(char *err, char *host, char *ipbuf)
int anetNonBlock(char *err, int fd)
static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len)
int anetTcpNonBlockConnect(char *err, char *addr, int port)
int anetUnixConnect(char *err, char *path)
static void anetSetError(char *err, const char *fmt,...)
int anetWrite(int fd, char *buf, int count)
int anetUnixNonBlockConnect(char *err, char *path)
int anetTcpAccept(char *err, int s, char *ip, int *port)
int anetUnixServer(char *err, char *path, mode_t perm)