27 #include <arpa/inet.h> 36 #include <sys/types.h> 38 #include <netinet/in.h> 61 if (getsockopt(ns->
fd, SOL_SOCKET, SO_SNDBUF, (
char *)&oldbufsize, &buflen) == -1)
63 if (oldbufsize < bufsize) {
65 LOG(
llevDebug,
"Default buffer size was %d bytes, will reset it to %d\n", oldbufsize, bufsize);
67 if (setsockopt(ns->
fd, SOL_SOCKET, SO_SNDBUF, (
char *)&bufsize,
sizeof(bufsize))) {
68 LOG(
llevError,
"init_connection: setsockopt unable to set output buf size to %d\n", bufsize);
71 buflen =
sizeof(oldbufsize);
72 getsockopt(ns->
fd, SOL_SOCKET, SO_SNDBUF, (
char *)&oldbufsize, &buflen);
74 LOG(
llevDebug,
"Socket buffer size now %d bytes\n", oldbufsize);
89 if (ioctlsocket(ns->
fd, FIONBIO , &temp) == -1)
90 LOG(
llevError,
"init_connection: Error on ioctlsocket.\n");
92 if (fcntl(ns->
fd, F_SETFL, O_NONBLOCK) == -1) {
172 struct linger linger_opt;
175 if (ns == NULL || ns->
listen == NULL) {
176 LOG(
llevError,
"init_listening_socket: missing listen info in socket_struct?!\n");
184 LOG(
llevError,
"Cannot create socket: %s\n", strerror(errno));
188 linger_opt.l_onoff = 0;
189 linger_opt.l_linger = 0;
190 if (setsockopt(ns->
fd, SOL_SOCKET, SO_LINGER, (
char *)&linger_opt,
sizeof(
struct linger))) {
191 LOG(
llevError,
"Cannot setsockopt(SO_LINGER): %s\n", strerror(errno));
197 #if defined(__osf__) || defined(hpux) || defined(sgi) || defined(NeXT) || \ 198 defined(__sun__) || defined(__linux__) || defined(SVR4) || \ 199 defined(__FreeBSD__) || defined(__OpenBSD__) || \ 209 if (setsockopt(ns->
fd, SOL_SOCKET, SO_REUSEADDR, &tmp,
sizeof(tmp))) {
210 LOG(
llevError,
"Cannot setsockopt(SO_REUSEADDR): %s\n", strerror(errno));
212 #ifdef HAVE_GETADDRINFO 213 if ((ns->
listen->
family == AF_INET6) && setsockopt(ns->
fd, IPPROTO_IPV6, IPV6_V6ONLY, &tmp,
sizeof(tmp))) {
214 LOG(
llevError,
"Cannot setsockopt(IPV6_V6ONLY): %s\n", strerror(errno));
219 if (setsockopt(ns->
fd, SOL_SOCKET, SO_REUSEADDR, (
char *)NULL, 0)) {
220 LOG(
llevError,
"Cannot setsockopt(SO_REUSEADDR): %s\n", strerror(errno));
225 #ifdef HAVE_GETNAMEINFO 226 getnameinfo(ns->
listen->
addr, ns->
listen->
addrlen, buf1,
sizeof(buf1), buf2,
sizeof(buf2), NI_NUMERICHOST|NI_NUMERICSERV);
231 ip = ntohl(((
struct sockaddr_in *)ns->
listen->
addr)->sin_addr.s_addr);
232 port = ntohs(((
struct sockaddr_in *)ns->
listen->
addr)->sin_port);
233 snprintf(buf1,
sizeof(buf1),
"%ld.%ld.%ld.%ld", (ip>>24)&255, (ip>>16)&255, (ip>>8)&255, ip&255);
234 snprintf(buf2,
sizeof(buf2),
"%d", port&65535);
236 LOG(
llevError,
"Cannot bind socket to [%s]:%s: %s\n", buf1, buf2, strerror(errno));
238 shutdown(ns->
fd, SD_BOTH);
246 if (listen(ns->
fd, 5) == (-1)) {
247 LOG(
llevError,
"Cannot listen on socket: %s\n", strerror(errno));
249 shutdown(ns->
fd, SD_BOTH);
263 int i, e, listen_socket_count;
264 #ifdef HAVE_GETADDRINFO 265 struct addrinfo *ai, *ai_p;
266 struct addrinfo hints;
269 struct sockaddr_in *insock;
270 struct protoent *protox;
277 WSAStartup(0x0101, &w);
285 # ifdef HAVE_GETDTABLESIZE 288 "Unable to find usable function to get max filedescriptors";
307 socket_info.
timeout.tv_sec = 0;
308 socket_info.
timeout.tv_usec = 0;
317 #ifdef HAVE_GETADDRINFO 318 memset(&hints,
'\0',
sizeof(hints));
319 hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
320 hints.ai_socktype = SOCK_STREAM;
322 e = getaddrinfo(NULL, buf, &hints, &ai);
324 LOG(
llevError,
"init_server: getaddrinfo: %s\n", gai_strerror(e));
328 listen_socket_count = 0;
329 for (ai_p = ai; ai_p != NULL; ai_p = ai_p->ai_next) {
330 listen_socket_count++;
333 assert(listen_socket_count > 0);
335 listen_socket_count = 1;
339 init_sockets = malloc(
sizeof(
socket_struct) * listen_socket_count);
341 for (i = 0; i < listen_socket_count; i++) {
347 #ifdef HAVE_GETADDRINFO 348 for (i = 0, ai_p = ai; i < listen_socket_count && ai_p != NULL; i++, ai_p = ai_p->ai_next) {
353 init_sockets[i].
listen->
addr = malloc(ai_p->ai_addrlen);
354 memcpy(init_sockets[i].listen->addr, ai_p->ai_addr, ai_p->ai_addrlen);
358 protox = getprotobyname(
"tcp");
359 if (protox == NULL) {
366 insock = calloc(
sizeof(
struct sockaddr_in), 1);
367 insock->sin_family = AF_INET;
369 insock->sin_addr.s_addr = htonl(INADDR_ANY);
370 init_sockets[0].
listen->
addr = (
struct sockaddr *) insock;
371 init_sockets[0].
listen->
addrlen =
sizeof(
struct sockaddr_in);
375 for (i = 0; i < listen_socket_count; i++) {
377 if (init_sockets[i].fd != -1)
381 LOG(
llevError,
"init_server: can't open any listening socket\n");
397 LOG(
llevDebug,
"Freeing all new client/server information.\n");
400 free(init_sockets[i].listen->addr);
401 free(init_sockets[i].listen);
415 shutdown(ns->
fd, SD_BOTH);
416 if (closesocket(ns->
fd)) {
void SockList_AddPrintf(SockList *sl, const char *format,...)
void free_player(player *pl)
void SockList_Init(SockList *sl)
unsigned char buf[MAXSOCKBUF]
void SockList_ResetRead(SockList *sl)
void fatal(enum fatal_error err)
uint16_t container_position
void account_char_free(Account_Char *chars)
void free_newsocket(socket_struct *ns)
#define DEFAULT_NUM_LOOK_OBJECTS
Account_Char * account_chars
void init_listening_socket(socket_struct *ns)
void free_all_newserver(void)
void SockList_Term(SockList *sl)
static void set_output_sock_buf(socket_struct *ns, int bufsize)
void SockList_AddString(SockList *sl, const char *data)
void free_socket_images(void)
uint32_t update_inventory
void read_client_images(void)
unsigned int get_faces_count()
void init_connection(socket_struct *ns, const char *from_ip)
void account_char_save(const char *account, Account_Char *chars)
uint8_t anims_sent[MAXANIMNUM]
socket_struct * init_sockets
void LOG(LogLevel logLevel, const char *format,...)
void final_free_player(player *pl)
#define FREE_AND_CLEAR(xyz)
struct listen_info * listen
void Send_With_Handling(socket_struct *ns, SockList *sl)