亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? server-socket.c

?? Serveez是一個服務器框架
?? C
字號:
/* * server-socket.c - server sockets for TCP, UDP, ICMP and pipes * * Copyright (C) 2000, 2001 Stefan Jahn <stefan@lkcc.org> * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. *  * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this package; see the file COPYING.  If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA.   * * $Id: server-socket.c,v 1.19 2001/09/11 15:05:48 ela Exp $ * */#if HAVE_CONFIG_H# include <config.h>#endif#define _GNU_SOURCE#include <stdio.h>#include <string.h>#if HAVE_UNISTD_H# include <unistd.h>#endif#include <fcntl.h>#include <errno.h>#include <sys/stat.h>#ifdef __MINGW32__# include <winsock2.h># if HAVE_WS2TCPIP_H#  include <ws2tcpip.h># endif#endif#ifndef __MINGW32__# include <sys/types.h># include <sys/socket.h># include <netinet/in.h># include <netdb.h>#endif#include "libserveez/boot.h"#include "libserveez/util.h"#include "libserveez/alloc.h"#include "libserveez/core.h"#include "libserveez/socket.h"#include "libserveez/pipe-socket.h"#include "libserveez/udp-socket.h"#include "libserveez/icmp-socket.h"#include "libserveez/server-core.h"#include "libserveez/server.h"#include "libserveez/portcfg.h"#include "libserveez/server-socket.h"/* * Create a listening server socket (network or pipe). @var{port} is the  * port configuration to bind the server socket to. Return a @code{NULL} * pointer on errors. */svz_socket_t *svz_server_create (svz_portcfg_t *port){  SOCKET server_socket;      /* server socket descriptor */  svz_socket_t *sock;        /* socket structure */  int optval;                /* value for setsockopt() */  struct sockaddr_in *addr;  /* bind address */  /* Create listening pipe server ? */  if (port->proto & PROTO_PIPE)    {      if ((sock = svz_sock_alloc ()) != NULL)	{	  svz_sock_unique_id (sock);	}      else	{	  svz_log (LOG_ERROR, "unable to allocate socket structure\n");	  return NULL;	}    }  /* Create listening TCP, UDP, ICMP or RAW server socket. */  else    {      /* First, create a server socket for listening. */      if ((server_socket = svz_socket_create (port->proto)) == (SOCKET) -1)	return NULL;      /* Set this ip option if we are using raw sockets. */      if (port->proto & PROTO_RAW)	{#ifdef IP_HDRINCL	  optval = 1;	  if (setsockopt (server_socket, IPPROTO_IP, IP_HDRINCL,			  (void *) &optval, sizeof (optval)) < 0)	    {	      svz_log (LOG_ERROR, "setsockopt: %s\n", NET_ERROR);	      if (closesocket (server_socket) < 0)		svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	      return NULL;	    }#else /* not IP_HDRINCL */	  closesocket (server_socket);	  svz_log (LOG_ERROR, "setsockopt: IP_HDRINCL undefined\n");	  return NULL;#endif /* IP_HDRINCL */	}      /*        * Make the socket be reusable (Minimize socket deadtime on        * server death).       */      optval = 1;      if (setsockopt (server_socket, SOL_SOCKET, SO_REUSEADDR,		      (void *) &optval, sizeof (optval)) < 0)	{	  svz_log (LOG_ERROR, "setsockopt: %s\n", NET_ERROR);	  if (closesocket (server_socket) < 0)	    svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	  return NULL;	}      /* Second, bind the socket to a port. */      addr = svz_portcfg_addr (port);      if (bind (server_socket, (struct sockaddr *) addr,		sizeof (struct sockaddr)) < 0)	{	  svz_log (LOG_ERROR, "bind: %s\n", NET_ERROR);	  if (closesocket (server_socket) < 0)	    svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	  return NULL;	}      /* Prepare for listening on that port (if TCP). */      if (port->proto & PROTO_TCP)	{	  if (listen (server_socket, port->tcp_backlog) < 0)	    {	      svz_log (LOG_ERROR, "listen: %s\n", NET_ERROR);	      if (closesocket (server_socket) < 0)		svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	      return NULL;	    }	}      /* Create a unique socket structure for the listening server socket. */      if ((sock = svz_sock_create (server_socket)) == NULL)	{	  /* Close the server socket if this routine failed. */	  if (closesocket (server_socket) < 0)	    svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	  return NULL;	}    }  /*    * Free the receive and send buffers not needed for TCP server   * sockets and PIPE server.   */  if (port->proto & (PROTO_TCP | PROTO_PIPE))    {      svz_free (sock->recv_buffer);      svz_free (sock->send_buffer);      sock->recv_buffer_size = 0;      sock->send_buffer_size = 0;      sock->recv_buffer = NULL;      sock->send_buffer = NULL;      sock->check_request = svz_sock_detect_proto;     }  /* Setup the socket structure. */  sock->flags |= SOCK_FLAG_LISTENING;  sock->flags &= ~SOCK_FLAG_CONNECTED;  sock->proto |= port->proto;  if (port->proto & PROTO_PIPE)    {      sock->read_socket = svz_pipe_accept;      if (svz_pipe_listener (sock, &port->pipe_recv, &port->pipe_send) == -1)	{	  svz_sock_free (sock);	  return NULL;	}      svz_log (LOG_NOTICE, "listening on pipe %s\n", sock->recv_pipe);    }  else    {      char *proto = "unknown";      if (port->proto & PROTO_TCP)	{	  sock->read_socket = svz_tcp_accept;	  proto = "tcp";	}      else if (port->proto & PROTO_UDP)	{	  svz_sock_resize_buffers (sock, port->send_buffer_size,				   port->recv_buffer_size);	  sock->read_socket = svz_udp_read_socket;	  sock->write_socket = svz_udp_write_socket;	  sock->check_request = svz_udp_check_request;	  proto = "udp";	}      else if (port->proto & PROTO_ICMP)	{	  svz_sock_resize_buffers (sock, port->send_buffer_size,				   port->recv_buffer_size);	  sock->read_socket = svz_icmp_read_socket;	  sock->write_socket = svz_icmp_write_socket;	  sock->check_request = svz_icmp_check_request;	  sock->itype = port->icmp_type;	  proto = "icmp";	}      addr = svz_portcfg_addr (port);      if (port->proto & (PROTO_TCP | PROTO_UDP))	svz_log (LOG_NOTICE, "listening on %s port %s:%u\n", proto,		 addr->sin_addr.s_addr == INADDR_ANY ? "*" : 		 svz_inet_ntoa (addr->sin_addr.s_addr),		 ntohs (addr->sin_port));      else	svz_log (LOG_NOTICE, "listening on %s port %s\n", proto,		 addr->sin_addr.s_addr == INADDR_ANY ? "*" : 		 svz_inet_ntoa (addr->sin_addr.s_addr));    }  return sock;}/* * Something happened on the a server socket, most probably a client  * connection which we will normally accept. This is the default callback * for @code{read_socket} for listening tcp sockets. */intsvz_tcp_accept (svz_socket_t *server_sock){  SOCKET client_socket;		/* socket to accept clients on */  struct sockaddr_in client;	/* address of connecting clients */  socklen_t client_size;	/* size of the address above */  svz_socket_t *sock;  svz_portcfg_t *port = server_sock->port;;  memset (&client, 0, sizeof (client));  client_size = sizeof (client);  client_socket = accept (server_sock->sock_desc, (struct sockaddr *) &client, 			  &client_size);  if (client_socket == INVALID_SOCKET)    {      svz_log (LOG_WARNING, "accept: %s\n", NET_ERROR);      return 0;    }  if ((SOCKET) svz_sock_connections >= svz_config.max_sockets)    {      svz_log (LOG_WARNING, "socket descriptor exceeds "	       "socket limit %d\n", svz_config.max_sockets);      if (closesocket (client_socket) < 0)	{	  svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	}      return 0;    }  svz_log (LOG_NOTICE, "TCP:%u: accepting client on socket %d\n", 	   ntohs (server_sock->local_port), client_socket);	    /*    * Sanity check. Just to be sure that we always handle   * correctly connects/disconnects.   */  sock = svz_sock_root;  while (sock && sock->sock_desc != client_socket)    sock = sock->next;  if (sock)    {      svz_log (LOG_FATAL, "socket %d already in use\n", sock->sock_desc);      if (closesocket (client_socket) < 0)	{	  svz_log (LOG_ERROR, "close: %s\n", NET_ERROR);	}      return -1;    }    /*   * Now enqueue the accepted client socket and assign the    * CHECK_REQUEST callback.   */  if ((sock = svz_sock_create (client_socket)) != NULL)    {      sock->flags |= SOCK_FLAG_CONNECTED;      sock->data = server_sock->data;      sock->check_request = server_sock->check_request;      sock->idle_func = svz_sock_idle_protect;       sock->idle_counter = 1;            svz_sock_resize_buffers (sock, port->send_buffer_size,			       port->recv_buffer_size);      svz_sock_enqueue (sock);      svz_sock_setparent (sock, server_sock);      svz_sock_connections++;      /* Check access and connect frequency here. */      if (svz_sock_check_access (server_sock, sock) < 0 ||	  svz_sock_check_frequency (server_sock, sock) < 0)	svz_sock_schedule_for_shutdown (sock);      /*        * We call the check_request() routine here once in order to       * allow "greedy" protocols (always returning success        * in the detect_proto() routine) to get their connection without       * sending anything.       */      if (sock->check_request)	if (sock->check_request (sock))	  svz_sock_schedule_for_shutdown (sock);    }  return 0;}/* * Check if client pipe is connected. This is the default callback for * @code{idle_func} for listening pipe sockets. */intsvz_pipe_accept (svz_socket_t *server_sock){#ifdef __MINGW32__  DWORD connect;#endif#if defined (HAVE_MKFIFO) || defined (HAVE_MKNOD) || defined (__MINGW32__)  HANDLE recv_pipe, send_pipe;  svz_socket_t *sock;  svz_portcfg_t *port = server_sock->port;  server_sock->idle_counter = 1;#endif#if HAVE_MKFIFO || HAVE_MKNOD  /*    * Try opening the server's send pipe. This will fail    * until the client has opened it for reading.   */  send_pipe = open (server_sock->send_pipe, O_NONBLOCK | O_WRONLY);  if (send_pipe == -1)    {      if (errno != ENXIO)	{	  svz_log (LOG_ERROR, "open: %s\n", SYS_ERROR);	  return -1;	}      return 0;    }  recv_pipe = server_sock->pipe_desc[READ];  /* Create a socket structure for the client pipe. */  if ((sock = svz_pipe_create (recv_pipe, send_pipe)) == NULL)    {      close (send_pipe);      return 0;    }#elif defined (__MINGW32__) /* not HAVE_MKFIFO */  recv_pipe = server_sock->pipe_desc[READ];  send_pipe = server_sock->pipe_desc[WRITE];  /* Try connecting to one of these pipes. This will fail until a client      has been connected. */  if (server_sock->flags & SOCK_FLAG_CONNECTING)    {      if (!GetOverlappedResult (send_pipe, server_sock->overlap[WRITE],                                 &connect, FALSE))        {          if (GetLastError () != ERROR_IO_INCOMPLETE)            {              svz_log (LOG_ERROR, "pipe: GetOverlappedResult: %s\n", 		       SYS_ERROR);              return -1;            }	  return 0;        }      else	{	  server_sock->flags &= ~SOCK_FLAG_CONNECTING;	  svz_log (LOG_NOTICE, "pipe: send pipe %s connected\n",		   server_sock->send_pipe);	}      if (!GetOverlappedResult (recv_pipe, server_sock->overlap[READ],                                 &connect, FALSE))        {          if (GetLastError () != ERROR_IO_INCOMPLETE)            {              svz_log (LOG_ERROR, "pipe: GetOverlappedResult: %s\n", 		       SYS_ERROR);              return -1;            }	  return 0;        }      else	{	  server_sock->flags &= ~SOCK_FLAG_CONNECTING;	  svz_log (LOG_NOTICE, "pipe: receive pipe %s connected\n",		   server_sock->recv_pipe);	}    }  /* Try to schedule both of the named pipes for connection. */  else    {      if (ConnectNamedPipe (send_pipe, server_sock->overlap[WRITE]))	return 0;      connect = GetLastError ();      /* Pipe is listening ? */      if (connect == ERROR_PIPE_LISTENING)	return 0;      /* Connection in progress ? */      else if (connect == ERROR_IO_PENDING)	server_sock->flags |= SOCK_FLAG_CONNECTING;      /* Pipe finally connected ? */      else if (connect != ERROR_PIPE_CONNECTED)	{	  svz_log (LOG_ERROR, "ConnectNamedPipe: %s\n", SYS_ERROR);	  return -1;	}      if (ConnectNamedPipe (recv_pipe, server_sock->overlap[READ]))	return 0;      connect = GetLastError ();      /* Pipe is listening ? */      if (connect == ERROR_PIPE_LISTENING)	return 0;      /* Connection in progress ? */      else if (connect == ERROR_IO_PENDING)	server_sock->flags |= SOCK_FLAG_CONNECTING;      /* Pipe finally connected ? */      else if (connect != ERROR_PIPE_CONNECTED)	{	  svz_log (LOG_ERROR, "ConnectNamedPipe: %s\n", SYS_ERROR);	  return -1;	}      /* Both pipes scheduled for connection ? */      if (server_sock->flags & SOCK_FLAG_CONNECTING)	{	  svz_log (LOG_NOTICE, "connection scheduled for pipe (%d-%d)\n",		   recv_pipe, send_pipe);	  return 0;	}    }  /* Create a socket structure for the client pipe. */  if ((sock = svz_pipe_create (recv_pipe, send_pipe)) == NULL)    {      /* Just disconnect the client pipes. */      if (!DisconnectNamedPipe (send_pipe))	svz_log (LOG_ERROR, "DisconnectNamedPipe: %s\n", SYS_ERROR);      if (!DisconnectNamedPipe (recv_pipe))	svz_log (LOG_ERROR, "DisconnectNamedPipe: %s\n", SYS_ERROR);      return 0;    }  /* Copy overlapped structures to client pipes. */  if (svz_os_version >= WinNT4x)    {      sock->overlap[READ] = server_sock->overlap[READ];      sock->overlap[WRITE] = server_sock->overlap[WRITE];    }#else /* not __MINGW32__ */  return -1;#endif /* neither HAVE_MKFIFO nor __MINGW32__ */#if defined (HAVE_MKFIFO) || defined (HAVE_MKNOD) || defined (__MINGW32__)  sock->read_socket = svz_pipe_read_socket;  sock->write_socket = svz_pipe_write_socket;  svz_sock_setreferrer (sock, server_sock);  sock->data = server_sock->data;  sock->check_request = server_sock->check_request;  sock->disconnected_socket = server_sock->disconnected_socket;  sock->idle_func = svz_sock_idle_protect;  sock->idle_counter = 1;  svz_sock_resize_buffers (sock, port->send_buffer_size,			   port->recv_buffer_size);  svz_sock_enqueue (sock);  svz_sock_setparent (sock, server_sock);  svz_log (LOG_NOTICE, "%s: accepting client on pipe (%d-%d)\n",	   server_sock->recv_pipe, 	   sock->pipe_desc[READ], sock->pipe_desc[WRITE]);  server_sock->flags |= SOCK_FLAG_INITED;  svz_sock_setreferrer (server_sock, sock);  /* Call the check_request() routine once for greedy protocols. */  if (sock->check_request)    if (sock->check_request (sock))      svz_sock_schedule_for_shutdown (sock);  return 0;#endif /* HAVE_MKFIFO or __MINGW32__ */}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97超碰欧美中文字幕| 日韩一区二区免费电影| 欧美日韩一区二区三区四区| 日韩精品在线一区| 一区二区三区高清不卡| 国产精品夜夜嗨| 欧美欧美欧美欧美首页| 国产精品传媒入口麻豆| 美女网站色91| 欧美日韩精品一区二区三区| 国产精品久久久99| 国产大片一区二区| 欧美变态口味重另类| 日产欧产美韩系列久久99| 91精彩视频在线观看| 亚洲人一二三区| 99久久婷婷国产综合精品| 久久久久久久久久电影| 精油按摩中文字幕久久| 欧美一卡2卡3卡4卡| 日韩激情视频网站| 欧美日韩一区二区三区在线看| 亚洲精品一卡二卡| 高清在线成人网| 欧美国产一区二区| 国产不卡在线一区| 国产精品午夜免费| 高清beeg欧美| 中文字幕一区二区不卡| 99视频在线观看一区三区| 国产精品天干天干在观线| 国产成人精品一区二| 欧美激情一区二区三区在线| 国产丶欧美丶日本不卡视频| 国产日韩精品一区二区三区 | 亚洲午夜羞羞片| 日本道在线观看一区二区| 亚洲主播在线观看| 欧美疯狂做受xxxx富婆| 日本亚洲一区二区| 欧美xxxx在线观看| 国产自产v一区二区三区c| 久久久久国色av免费看影院| 黄页网站大全一区二区| 91女神在线视频| 午夜精品久久久久久久99水蜜桃| 一本大道久久a久久综合| 亚洲精选免费视频| 在线电影一区二区三区| 国产做a爰片久久毛片| 久久精品免视看| 成人黄色网址在线观看| 亚洲愉拍自拍另类高清精品| 欧美精品粉嫩高潮一区二区| 亚洲丶国产丶欧美一区二区三区| 欧美伊人久久久久久午夜久久久久| 亚洲综合一区二区三区| 日韩一二三区视频| 不卡av在线免费观看| 亚洲蜜臀av乱码久久精品| 欧美日韩免费高清一区色橹橹| 日本视频免费一区| 久久久久久久久久久黄色| 不卡视频免费播放| 亚洲黄色av一区| 69堂成人精品免费视频| 国产伦精品一区二区三区免费迷| 成人欧美一区二区三区视频网页 | 欧美疯狂性受xxxxx喷水图片| 欧美a级一区二区| 国产精品久久久久久亚洲伦| 欧美日本在线视频| 成人av免费在线播放| 日韩福利电影在线| 中文字幕在线一区二区三区| 91精品国产一区二区| av电影在线观看完整版一区二区| 日韩中文字幕一区二区三区| 日韩美女主播在线视频一区二区三区 | 亚洲欧美另类久久久精品| 欧美一区二区在线免费观看| 99精品视频中文字幕| 激情都市一区二区| 亚洲成人久久影院| 中文字幕一区二区三区在线播放| 久久久久综合网| 91精品国产麻豆| 在线免费亚洲电影| 粉嫩av一区二区三区粉嫩| 免费精品99久久国产综合精品| 1024成人网| 国产调教视频一区| 日韩欧美卡一卡二| 欧美日韩高清在线| 91免费版在线看| 成人精品视频网站| 国产精品资源网站| 男女性色大片免费观看一区二区| 一区二区三区精品| 亚洲欧美综合网| 国产精品国产a| 久久久噜噜噜久久人人看 | 精品少妇一区二区三区在线视频 | 精品亚洲成a人| 五月婷婷久久丁香| 一区二区三区影院| 亚洲人xxxx| 亚洲欧洲色图综合| 中文无字幕一区二区三区| 国产三级精品在线| 久久久久国产精品麻豆| 精品国精品国产尤物美女| 69成人精品免费视频| 91精品国产麻豆| 精品久久人人做人人爰| 日韩一区国产二区欧美三区| 欧美一区2区视频在线观看| 91精品国产综合久久蜜臀| 在线不卡中文字幕| 日韩欧美一级片| 26uuu色噜噜精品一区二区| 久久婷婷一区二区三区| 日本一区二区动态图| 成人欧美一区二区三区在线播放| 三级不卡在线观看| 婷婷综合五月天| 久久国内精品自在自线400部| 美女mm1313爽爽久久久蜜臀| 老鸭窝一区二区久久精品| 国内精品久久久久影院一蜜桃| 国产精品一级片| 成人小视频免费观看| 91毛片在线观看| 欧美精品xxxxbbbb| 国产婷婷色一区二区三区四区| 自拍偷在线精品自拍偷无码专区| 亚洲精品免费在线播放| 日韩二区在线观看| 国产91在线观看丝袜| 91久久精品午夜一区二区| 欧美一激情一区二区三区| 欧美激情一区在线观看| 亚欧色一区w666天堂| 国产在线视视频有精品| 97超碰欧美中文字幕| 日韩一区二区三区免费观看| 国产日韩精品视频一区| 亚洲在线观看免费视频| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美视频完全免费看| 精品三级av在线| 亚洲欧美另类图片小说| 美女在线一区二区| 日本伦理一区二区| 久久亚洲综合色| 亚洲免费观看高清完整版在线| 日韩精品成人一区二区三区| 国产盗摄视频一区二区三区| 欧美视频三区在线播放| 国产亚洲欧洲997久久综合| 一区二区三区不卡在线观看| 奇米四色…亚洲| 日本久久一区二区三区| 国产午夜亚洲精品不卡| 亚洲大片在线观看| www.日韩在线| 欧美一区二区三区精品| 亚洲欧洲国产日本综合| 国产精品资源在线| 欧美一区二区黄色| 一区二区三区日韩精品视频| 国产成人综合亚洲网站| 日韩欧美黄色影院| 亚洲成人资源在线| 成a人片亚洲日本久久| 久久久亚洲精华液精华液精华液| 午夜激情一区二区| 精品一区二区三区不卡| 成人精品电影在线观看| 久久婷婷国产综合国色天香 | 亚洲精品久久嫩草网站秘色| 国产精品一区二区不卡| 精品国产91亚洲一区二区三区婷婷 | 精品入口麻豆88视频| 日韩高清在线一区| 91浏览器打开| 一区视频在线播放| 丰满放荡岳乱妇91ww| 久久久www免费人成精品| 久久se精品一区精品二区| 日韩一区二区三区视频在线| 亚洲永久免费视频| 欧洲亚洲国产日韩| 亚洲欧洲国产专区| 成人综合激情网| 亚洲欧洲三级电影| 一本一道久久a久久精品综合蜜臀| 久久欧美中文字幕| 福利视频网站一区二区三区| 久久精品男人天堂av|