static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len) { int fd; while(1) { fd = accept(s,sa,len); if (fd == -1) { #ifndef _WIN32 if (errno == EINTR) { continue; #else errno = WSAGetLastError(); if (errno == WSAEWOULDBLOCK) { #endif } else { anetSetError(err, "accept: %s", strerror(errno)); } } break; } return fd; } int anetTcpAccept(char *err, int s, char *ip, int *port) { int fd; struct sockaddr_in sa; socklen_t salen = sizeof(sa); if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == ANET_ERR) return ANET_ERR; if (ip) strcpy(ip,inet_ntoa(sa.sin_addr)); if (port) *port = ntohs(sa.sin_port); return fd; }
int anetTcpAccept(char *err, int s, char *ip, size_t ip_len, int *port) { int fd; struct sockaddr_storage sa; socklen_t salen = sizeof(sa); if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == -1) { return ANET_ERR; } if (sa.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&sa; if (ip) { inet_ntop(AF_INET,(void*)&(s->sin_addr),ip,ip_len); } if (port) { *port = ntohs(s->sin_port); } } else { struct sockaddr_in6 *s = (struct sockaddr_in6 *)&sa; if (ip) { inet_ntop(AF_INET6,(void*)&(s->sin6_addr),ip,ip_len); } if (port) { *port = ntohs(s->sin6_port); } } return fd; }
int anetUnixAccept(char *err, int s) { int fd; struct sockaddr_un sa; socklen_t salen = sizeof(sa); if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == ANET_ERR) return ANET_ERR; return fd; }
int anetTcpAccept(char *err, int s, char *ip, int *port) { int fd; struct sockaddr_in sa; socklen_t salen = sizeof(sa); if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == ANET_ERR) return ANET_ERR; if (ip) strcpy(ip,inet_ntoa(sa.sin_addr)); if (port) *port = ntohs(sa.sin_port); return fd; }
int anetTcpAccept(char*err,int s,char*ip,size_t ip_len,int*port) { int fd; struct sockaddr_in sa; socklen_t salen=sizeof(sa); if((fd=anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen))<0) return ANET_ERR; if(ip) inet_ntop(AF_INET,(void*)&(sa.sin_addr),ip,ip_len); if(port)*port=ntohs(sa.sin_port); return fd; }
int anetUnixAccept(char *err, int s) { #ifdef _WIN32 ANET_NOTUSED(err); ANET_NOTUSED(s); return ANET_ERR; #else int fd; struct sockaddr_un sa; socklen_t salen = sizeof(sa); if ((fd = anetGenericAccept(err,s,(struct sockaddr*)&sa,&salen)) == ANET_ERR) return ANET_ERR; return fd; #endif }