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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? sockgen.c

?? 嵌入式Linux系統(tǒng)用的web server,開(kāi)源代碼,非常好用
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):

/*
 *	sockGen.c -- Posix Socket support module for general posix use
 *
 *	Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
 *
 * $Id: sockGen.c,v 1.6 2003/04/11 18:00:12 bporter Exp $
 */

/******************************** Description *********************************/

/*
 *	Posix Socket Module.  This supports blocking and non-blocking buffered 
 *	socket I/O.
 */

#if (!defined (WIN) || defined (LITTLEFOOT) || defined (WEBS))

/********************************** Includes **********************************/
#ifndef CE
#include	<errno.h>
#include	<fcntl.h>
#include	<string.h>
#include	<stdlib.h>
#endif

#ifdef UEMF
	#include	"uemf.h"
#else
	#include	<socket.h>
	#include	<types.h>
	#include	<unistd.h>
	#include	"emfInternal.h"
#endif

#ifdef VXWORKS
	#include	<hostLib.h>
#endif

/************************************ Locals **********************************/

extern socket_t		**socketList;			/* List of open sockets */
extern int			socketMax;				/* Maximum size of socket */
extern int			socketHighestFd;		/* Highest socket fd opened */
static int			socketOpenCount = 0;	/* Number of task using sockets */

/***************************** Forward Declarations ***************************/

static void socketAccept(socket_t *sp);
static int 	socketDoEvent(socket_t *sp);
static int	tryAlternateConnect(int sock, struct sockaddr *sockaddr);

/*********************************** Code *************************************/
/*
 *	Open socket module
 */

int socketOpen()
{
#if (defined (CE) || defined (WIN))
    WSADATA 	wsaData;
#endif

	if (++socketOpenCount > 1) {
		return 0;
	}

#if (defined (CE) || defined (WIN))
	if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {
		return -1;
	}
	if (wsaData.wVersion != MAKEWORD(1,1)) {
		WSACleanup();
		return -1;
	}
#endif

	socketList = NULL;
	socketMax = 0;
	socketHighestFd = -1;

	return 0;
}

/******************************************************************************/
/*
 *	Close the socket module, by closing all open connections
 */

void socketClose()
{
	int		i;

	if (--socketOpenCount <= 0) {
		for (i = socketMax; i >= 0; i--) {
			if (socketList && socketList[i]) {
				socketCloseConnection(i);
			}
		}
		socketOpenCount = 0;
	}
}

/******************************************************************************/
/*
 *	Open a client or server socket. Host is NULL if we want server capability.
 */

int socketOpenConnection(char *host, int port, socketAccept_t accept, int flags)
{
#if (!defined (NO_GETHOSTBYNAME) && !defined (VXWORKS))
	struct hostent		*hostent;					/* Host database entry */
#endif /* ! (NO_GETHOSTBYNAME || VXWORKS) */
	socket_t			*sp;
	struct sockaddr_in	sockaddr;
	int					sid, bcast, dgram, rc;

	if (port > SOCKET_PORT_MAX) {
		return -1;
	}
/*
 *	Allocate a socket structure
 */
	if ((sid = socketAlloc(host, port, accept, flags)) < 0) {
		return -1;
	}
	sp = socketList[sid];
	a_assert(sp);

/*
 *	Create the socket address structure
 */
	memset((char *) &sockaddr, '\0', sizeof(struct sockaddr_in));
	sockaddr.sin_family = AF_INET;
	sockaddr.sin_port = htons((short) (port & 0xFFFF));

	if (host == NULL) {
		sockaddr.sin_addr.s_addr = INADDR_ANY;
	} else {
		sockaddr.sin_addr.s_addr = inet_addr(host);
		if (sockaddr.sin_addr.s_addr == INADDR_NONE) {
/*
 *			If the OS does not support gethostbyname functionality, the macro:
 *			NO_GETHOSTBYNAME should be defined to skip the use of gethostbyname.
 *			Unfortunatly there is no easy way to recover, the following code
 *			simply uses the basicGetHost IP for the sockaddr.
 */

#ifdef NO_GETHOSTBYNAME
			if (strcmp(host, basicGetHost()) == 0) {
				sockaddr.sin_addr.s_addr = inet_addr(basicGetAddress());
			}
			if (sockaddr.sin_addr.s_addr == INADDR_NONE) {
				socketFree(sid);
				return -1;
			}
#elif (defined (VXWORKS))
			sockaddr.sin_addr.s_addr = (unsigned long) hostGetByName(host);
			if (sockaddr.sin_addr.s_addr == NULL) {
				errno = ENXIO;
				socketFree(sid);
				return -1;
			}
#else
			hostent = gethostbyname(host);
			if (hostent != NULL) {
				memcpy((char *) &sockaddr.sin_addr, 
					(char *) hostent->h_addr_list[0],
					(size_t) hostent->h_length);
			} else {
				char	*asciiAddress;
				char_t	*address;

				address = basicGetAddress();
				asciiAddress = ballocUniToAsc(address, gstrlen(address));
				sockaddr.sin_addr.s_addr = inet_addr(asciiAddress);
				bfree(B_L, asciiAddress);
				if (sockaddr.sin_addr.s_addr == INADDR_NONE) {
					errno = ENXIO;
					socketFree(sid);
					return -1;
				}
			}
#endif /* (NO_GETHOSTBYNAME || VXWORKS) */
		}
	}

	bcast = sp->flags & SOCKET_BROADCAST;
	if (bcast) {
		sp->flags |= SOCKET_DATAGRAM;
	}
	dgram = sp->flags & SOCKET_DATAGRAM;

/*
 *	Create the socket. Support for datagram sockets. Set the close on
 *	exec flag so children don't inherit the socket.
 */
	sp->sock = socket(AF_INET, dgram ? SOCK_DGRAM: SOCK_STREAM, 0);
	if (sp->sock < 0) {
		socketFree(sid);
		return -1;
	}
#ifndef __NO_FCNTL
	fcntl(sp->sock, F_SETFD, FD_CLOEXEC);
#endif
	socketHighestFd = max(socketHighestFd, sp->sock);

/*
 *	If broadcast, we need to turn on broadcast capability.
 */
	if (bcast) {
		int broadcastFlag = 1;
		if (setsockopt(sp->sock, SOL_SOCKET, SO_BROADCAST,
				(char *) &broadcastFlag, sizeof(broadcastFlag)) < 0) {
			socketFree(sid);
			return -1;
		}
	}

/*
 *	Host is set if we are the client
 */
	if (host) {
/*
 *		Connect to the remote server in blocking mode, then go into 
 *		non-blocking mode if desired.
 */
		if (!dgram) {
			if (! (sp->flags & SOCKET_BLOCK)) {
/*
 *				sockGen.c is only used for Windows products when blocking
 *				connects are expected.  This applies to FieldUpgrader
 *				agents and open source webserver connectws.  Therefore the
 *				asynchronous connect code here is not compiled.
 */
#if (defined (WIN) || defined (CE)) && (!defined (LITTLEFOOT) && !defined (WEBS))
				int flag;

				sp->flags |= SOCKET_ASYNC;
/*
 *				Set to non-blocking for an async connect
 */
				flag = 1;
				if (ioctlsocket(sp->sock, FIONBIO, &flag) == SOCKET_ERROR) {
					socketFree(sid);
					return -1;
				}
#else
				socketSetBlock(sid, 1);
#endif /* #if (WIN || CE) && !(LITTLEFOOT || WEBS) */

			}
			if ((rc = connect(sp->sock, (struct sockaddr *) &sockaddr,
				sizeof(sockaddr))) < 0 && 
				(rc = tryAlternateConnect(sp->sock,
				(struct sockaddr *) &sockaddr)) < 0) {
#if (defined (WIN) || defined (CE))
				if (socketGetError() != EWOULDBLOCK) {
					socketFree(sid);
					return -1;
				}
#else
				socketFree(sid);
				return -1;

#endif /* WIN || CE */

			}
		}
	} else {
/*
 *		Bind to the socket endpoint and the call listen() to start listening
 */
		rc = 1;
		setsockopt(sp->sock, SOL_SOCKET, SO_REUSEADDR, (char *)&rc, sizeof(rc));
		if (bind(sp->sock, (struct sockaddr *) &sockaddr, 
				sizeof(sockaddr)) < 0) {
			socketFree(sid);
			return -1;
		}

		if (! dgram) {
			if (listen(sp->sock, SOMAXCONN) < 0) {
				socketFree(sid);
				return -1;
			}
#ifndef UEMF
			sp->fileHandle = emfCreateFileHandler(sp->sock, SOCKET_READABLE,
				(emfFileProc *) socketAccept, (void *) sp);
#else
			sp->flags |= SOCKET_LISTENING;
#endif
		}
		sp->handlerMask |= SOCKET_READABLE;
	}

/*
 *	Set the blocking mode
 */

	if (flags & SOCKET_BLOCK) {
		socketSetBlock(sid, 1);
	} else {
		socketSetBlock(sid, 0);
	}
	return sid;
}


/******************************************************************************/
/*
 *	If the connection failed, swap the first two bytes in the 
 *	sockaddr structure.  This is a kludge due to a change in
 *	VxWorks between versions 5.3 and 5.4, but we want the 
 *	product to run on either.
 */

static int tryAlternateConnect(int sock, struct sockaddr *sockaddr)
{
#ifdef VXWORKS
	char *ptr;

	ptr = (char *)sockaddr;
	*ptr = *(ptr+1);
	*(ptr+1) = 0;
	return connect(sock, sockaddr, sizeof(struct sockaddr));
#else
	return -1;
#endif /* VXWORKS */
}

/******************************************************************************/
/*
 *	Close a socket
 */

void socketCloseConnection(int sid)
{
	socket_t	*sp;

	if ((sp = socketPtr(sid)) == NULL) {
		return;
	}
	socketFree(sid);
}

/******************************************************************************/
/*
 *	Accept a connection. Called as a callback on incoming connection.
 */

static void socketAccept(socket_t *sp)
{
	struct sockaddr_in	addr;
	socket_t 			*nsp;
	size_t				len;
	char				*pString;
	int 				newSock, nid;


#ifdef NW
	NETINET_DEFINE_CONTEXT;
#endif

	a_assert(sp);

/*
 *	Accept the connection and prevent inheriting by children (F_SETFD)
 */
	len = sizeof(struct sockaddr_in);
	if ((newSock = accept(sp->sock, (struct sockaddr *) &addr, (int *) &len)) < 0) {
		return;
	}
#ifndef __NO_FCNTL
	fcntl(newSock, F_SETFD, FD_CLOEXEC);
#endif
	socketHighestFd = max(socketHighestFd, newSock);

/*
 *	Create a socket structure and insert into the socket list
 */
	nid = socketAlloc(sp->host, sp->port, sp->accept, sp->flags);
	nsp = socketList[nid];
	a_assert(nsp);
	nsp->sock = newSock;
	nsp->flags &= ~SOCKET_LISTENING;

	if (nsp == NULL) {
		return;
	}
/*
 *	Set the blocking mode before calling the accept callback.
 */

	socketSetBlock(nid, (nsp->flags & SOCKET_BLOCK) ? 1: 0);
/*
 *	Call the user accept callback. The user must call socketCreateHandler
 *	to register for further events of interest.
 */
	if (sp->accept != NULL) {
		pString = inet_ntoa(addr.sin_addr);
		if ((sp->accept)(nid, pString, ntohs(addr.sin_port), sp->sid) < 0) {
			socketFree(nid);
		}
#ifdef VXWORKS
		free(pString);
#endif
	}
}

/******************************************************************************/
/*
 *	Get more input from the socket and return in buf.
 *	Returns 0 for EOF, -1 for errors and otherwise the number of bytes read.
 */

int socketGetInput(int sid, char *buf, int toRead, int *errCode)
{
	struct sockaddr_in 	server;
	socket_t			*sp;
	int 				len, bytesRead;

	a_assert(buf);
	a_assert(errCode);

	*errCode = 0;

	if ((sp = socketPtr(sid)) == NULL) {
		return -1;
	}

/*
 *	If we have previously seen an EOF condition, then just return
 */
	if (sp->flags & SOCKET_EOF) {
		return 0;
	}
#if ((defined (WIN) || defined (CE)) && (!defined (LITTLEFOOT) && !defined  (WEBS)))
	if ( !(sp->flags & SOCKET_BLOCK)
			&& ! socketWaitForEvent(sp,  FD_CONNECT, errCode)) {
		return -1;
	}
#endif

/*
 *	Read the data
 */
	if (sp->flags & SOCKET_DATAGRAM) {
		len = sizeof(server);
		bytesRead = recvfrom(sp->sock, buf, toRead, 0,
			(struct sockaddr *) &server, &len);
	} else {
		bytesRead = recv(sp->sock, buf, toRead, 0);
	}
   
   /*
    * BUG 01865 -- CPU utilization hangs on Windows. The original code used 
    * the 'errno' global variable, which is not set by the winsock functions
    * as it is under *nix platforms. We use the platform independent
    * socketGetError() function instead, which does handle Windows correctly. 
    * Other, *nix compatible platforms should work as well, since on those
    * platforms, socketGetError() just returns the value of errno.
    * Thanks to Jonathan Burgoyne for the fix.
    */
   if (bytesRead < 0) 
   {
      *errCode = socketGetError();
      if (*errCode == ECONNRESET) 
      {
         sp->flags |= SOCKET_CONNRESET;
         return 0;
      }
      return -1;
   }
	return bytesRead;
}

/******************************************************************************/
/*
 *	Process an event on the event queue
 */

#ifndef UEMF

static int socketEventProc(void *data, int mask)
{
	socket_t		*sp;
	ringq_t			*rq;
	int 			sid;

	sid = (int) data;

	a_assert(sid >= 0 && sid < socketMax);
	a_assert(socketList[sid]);

	if ((sp = socketPtr(sid)) == NULL) {
		return 1;
	}

/*
 *	If now writable and flushing in the background, continue flushing
 */
	if (mask & SOCKET_WRITABLE) {
		if (sp->flags & SOCKET_FLUSHING) {
			rq = &sp->outBuf;
			if (ringqLen(rq) > 0) {
				socketFlush(sp->sid);
			} else {
				sp->flags &= ~SOCKET_FLUSHING;
			}
		}
	}

/*
 *	Now invoke the users socket handler. NOTE: the handler may delete the
 *	socket, so we must be very careful after calling the handler.
 */
	if (sp->handler && (sp->handlerMask & mask)) {
		(sp->handler)(sid, mask & sp->handlerMask, sp->handler_data);
	}
	if (socketList && sid < socketMax && socketList[sid] == sp) {
		socketRegisterInterest(sp, sp->handlerMask);
	}
	return 1;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲不卡一区二区三区| 国产一区91精品张津瑜| 精品国产一区二区在线观看| 99精品国产91久久久久久| 蜜桃在线一区二区三区| 亚洲女同女同女同女同女同69| 日韩精品一区二区三区四区视频| www..com久久爱| 免费的国产精品| 玉米视频成人免费看| 久久这里只有精品首页| 欧美日韩国产综合草草| 波多野结衣欧美| 精品一区二区国语对白| 亚洲一区二区三区美女| 中文字幕一区不卡| 国产午夜一区二区三区| 日韩女优制服丝袜电影| 欧美日韩在线三区| 91丨九色丨尤物| 国产超碰在线一区| 国模冰冰炮一区二区| 秋霞成人午夜伦在线观看| 亚洲一区av在线| 亚洲免费资源在线播放| 国产精品乱码久久久久久| 久久综合九色综合欧美就去吻 | 亚洲精品国产成人久久av盗摄| 日韩免费观看2025年上映的电影| 欧美中文字幕一区| 91麻豆国产福利精品| 99久久久精品免费观看国产蜜| 国产又黄又大久久| 久久精品国产亚洲5555| 免费成人av资源网| 免费高清视频精品| 蜜桃久久av一区| 奇米综合一区二区三区精品视频| 亚洲大片精品永久免费| 亚洲国产精品天堂| 性感美女极品91精品| 99久久综合狠狠综合久久| 国产精品1区二区.| 风间由美中文字幕在线看视频国产欧美 | 9久草视频在线视频精品| 国产高清不卡一区| 国产露脸91国语对白| 国产白丝精品91爽爽久久| 丁香天五香天堂综合| 风间由美一区二区av101| 成人理论电影网| 日本精品一级二级| 欧美肥大bbwbbw高潮| 欧美一卡二卡三卡四卡| 日韩欧美亚洲一区二区| 久久亚洲一区二区三区明星换脸| 久久久久久99久久久精品网站| 国产日韩视频一区二区三区| 国产精品女主播在线观看| 亚洲欧洲成人自拍| 亚洲线精品一区二区三区八戒| 亚洲成人免费视频| 免费观看30秒视频久久| 国产成人在线观看| 99热国产精品| 欧美色图天堂网| 这里只有精品免费| 久久久久国产成人精品亚洲午夜| 中文字幕乱码日本亚洲一区二区| 18成人在线视频| 午夜精品久久久久久久99樱桃| 蜜臀av性久久久久av蜜臀妖精| 国产尤物一区二区| 91在线丨porny丨国产| 欧美精品v日韩精品v韩国精品v| 日韩一区二区在线看片| 国产欧美日韩另类视频免费观看| 亚洲欧美日韩中文播放 | 在线精品视频一区二区| 91精品国产色综合久久ai换脸 | 国产专区综合网| 色婷婷综合激情| 日韩欧美中文字幕制服| 国产农村妇女毛片精品久久麻豆| 亚洲精品中文字幕在线观看| 日韩电影免费在线观看网站| 国产91精品在线观看| 欧美三级电影网站| 久久久久久99精品| 视频一区二区三区在线| 丁香另类激情小说| 在线91免费看| 亚洲美女在线国产| 国内精品久久久久影院薰衣草| 一本大道av伊人久久综合| 欧美精品一区男女天堂| 亚洲成人资源网| 成人黄色777网| 欧美白人最猛性xxxxx69交| 日韩理论片一区二区| 激情综合网天天干| 欧美日韩一区二区三区高清| 国产精品伦一区二区三级视频| 美腿丝袜亚洲三区| 欧美性一区二区| 国产精品区一区二区三区| 美女视频网站黄色亚洲| 91精彩视频在线观看| 国产精品久久久久久妇女6080| 久久精品国产亚洲aⅴ| 欧美日韩国产中文| 一区二区成人在线| 99在线视频精品| 久久久久高清精品| 久久精品噜噜噜成人88aⅴ| 欧美日韩中文国产| 亚洲日本免费电影| 成人av电影在线| 国产日韩高清在线| 国产自产视频一区二区三区| 91精品一区二区三区久久久久久| 一区二区三区鲁丝不卡| av不卡免费电影| 国产精品午夜电影| 国产乱子轮精品视频| 日韩欧美国产综合一区| 日韩福利视频网| 91精品国产色综合久久久蜜香臀| 亚洲电影一区二区三区| 日本高清成人免费播放| 中文字幕一区二区三区在线观看 | 99精品黄色片免费大全| 国产欧美日韩不卡| 丰满少妇久久久久久久| 中文字幕不卡在线| 成人激情免费视频| 国产精品另类一区| www.综合网.com| 最新热久久免费视频| 99国产精品一区| 亚洲男人的天堂在线观看| 色八戒一区二区三区| 亚洲一区二区偷拍精品| 欧美久久久久中文字幕| 午夜视频在线观看一区| 69久久99精品久久久久婷婷| 日本欧美大码aⅴ在线播放| 日韩午夜精品电影| 国产一区中文字幕| 国产日韩精品一区| 91丨国产丨九色丨pron| 一区二区在线观看不卡| 欧美三级蜜桃2在线观看| 日产国产欧美视频一区精品| 精品国产91乱码一区二区三区 | 99在线精品免费| 椎名由奈av一区二区三区| 色狠狠色噜噜噜综合网| 日韩和欧美的一区| 国产视频在线观看一区二区三区| 成人ar影院免费观看视频| 一个色在线综合| 日韩欧美亚洲一区二区| 大胆欧美人体老妇| 亚洲综合av网| 亚洲精品一区二区三区福利| 成人免费视频一区| 亚洲国产精品自拍| 久久综合色之久久综合| 色综合久久久久综合体桃花网| 亚洲第一二三四区| 久久久久久久综合| 色婷婷av久久久久久久| 精品一区二区三区影院在线午夜| 中文av字幕一区| 777色狠狠一区二区三区| 国产成人亚洲精品狼色在线| 亚洲精品欧美激情| 欧美变态tickle挠乳网站| 91啪在线观看| 久久精品国产秦先生| 亚洲欧美日韩成人高清在线一区| 欧美剧情电影在线观看完整版免费励志电影| 狠狠色狠狠色综合系列| 一区二区三区中文免费| 精品国精品国产尤物美女| 91捆绑美女网站| 精品中文字幕一区二区| 亚洲精品免费在线| 久久精品视频在线免费观看| 日本高清成人免费播放| 国产剧情在线观看一区二区| 亚洲在线视频网站| 国产色婷婷亚洲99精品小说| 欧美精品成人一区二区三区四区| 丁香婷婷综合色啪| 精品一区二区三区免费播放| 亚洲午夜一区二区三区| 国产精品色眯眯| 欧美α欧美αv大片|