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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? socket.cpp

?? 跨操作系統(tǒng)的微型中間件
?? CPP
字號:
#include <string.h>#ifndef __Win32__#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <sys/uio.h>#include <unistd.h>#include <netinet/tcp.h>#include <fcntl.h>#endif#include <errno.h>#include "OS.h"#include "Socket.h"#include "SocketUtils.h"#include "OSThread.h"#include "MyAssert.h"#ifdef USE_NETLOG#include <netlog.h>#endif#define INVALID_FD	(-1)Socket::Socket():   fState(kBlockingSocketType),//    fLocalAddrStrPtr(NULL),//   fLocalDNSStrPtr(NULL),    fPortStr(fPortBuffer, kPortBufSizeInBytes){	fFileDesc = INVALID_FD;    fLocalAddr.sin_addr.s_addr = 0;    fLocalAddr.sin_port = 0;    fDestAddr.sin_addr.s_addr = 0;    fDestAddr.sin_port = 0;   }Socket::~Socket(){	Close();}void Socket::Initialize(){#ifdef __Win32__    // Start Win32 DLLs    WORD wsVersion = MAKEWORD(1, 1);    WSADATA wsData;    (void)::WSAStartup(wsVersion, &wsData);#else#endif}void Socket::Uninitialize(){#ifdef __Win32__	WSACleanup();#else#endif}OS_Error Socket::Open(int theType){	Close();		if(fFileDesc == INVALID_FD)	{		fFileDesc = ::socket(PF_INET, theType, 0);		if (fFileDesc == kInvalidFileDesc)		{			Int32 ErrNo = (OS_Error)OS::GetErrno();			return ErrNo;		}#ifdef __Win32__		//set default send and receive buffer size		SetSocketBufSize(32*1024);		SetSocketRcvBufSize(32*1024);#endif	}          return OS_NoErr;}void Socket::Close(){	if(fFileDesc != INVALID_FD)	{#ifdef __Win32__		::closesocket(fFileDesc);#else		//::shutdown(fFileDesc,SHUT_RDWR);		::close(fFileDesc);#endif		fFileDesc = INVALID_FD;	}}void Socket::ReuseAddr(){    int one = 1;    int err = ::setsockopt(fFileDesc, SOL_SOCKET, SO_REUSEADDR, (char*)&one, sizeof(int));    Assert(err == 0);   }void Socket::NoDelay(){    int one = 1;    int err = ::setsockopt(fFileDesc, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(int));    Assert(err == 0);   }void Socket::KeepAlive(){    int one = 1;    int err = ::setsockopt(fFileDesc, SOL_SOCKET, SO_KEEPALIVE, (char*)&one, sizeof(int));    Assert(err == 0);   }void    Socket::SetSocketBufSize(UInt32 inNewSize){    int bufSize = inNewSize;    int err = ::setsockopt(fFileDesc, SOL_SOCKET, SO_SNDBUF, (char*)&bufSize, sizeof(int));    Assert(err == 0);}OS_Error    Socket::SetSocketRcvBufSize(UInt32 inNewSize){    int bufSize = inNewSize;    int err = ::setsockopt(fFileDesc, SOL_SOCKET, SO_RCVBUF, (char*)&bufSize, sizeof(int));    if (err == -1)        return OS::GetErrno();    return OS_NoErr;}OS_Error Socket::Bind(UInt32 addr, UInt16 port){#ifndef USE_NETLOG#if defined(__Win32__)    // missing from some platform includes    typedef int socklen_t;#endif#endif    socklen_t len = sizeof(fLocalAddr);    ::memset(&fLocalAddr, 0, sizeof(fLocalAddr));    fLocalAddr.sin_family = AF_INET;    fLocalAddr.sin_port = htons(port);    fLocalAddr.sin_addr.s_addr = htonl(addr);    int err = ::bind(fFileDesc, (sockaddr *)&fLocalAddr, sizeof(fLocalAddr));    if (err == -1)    {        fLocalAddr.sin_port = 0;        fLocalAddr.sin_addr.s_addr = 0;        return (OS_Error)OS::GetErrno();    }    else 
		::getsockname(fFileDesc, (sockaddr *)&fLocalAddr, &len); // get the kernel to fill in unspecified values   	fState |= kBound;    return OS_NoErr;}std::string Socket::GetLocalAddrStr(){	string strTmp;	SocketUtils::ConvertAddrToString(fLocalAddr.sin_addr, &strTmp);	return strTmp;}OS_Error Socket::Send(const char* inData, const UInt32 inLength, UInt32* outLengthSent,UInt32 vTimeOut){	Assert(inData != NULL);		if (!(fState & kConnected))	return (OS_Error)ENOTCONN;	//timout calc	int err = 0;	if(vTimeOut != 0)	{		struct timeval val;		val.tv_sec = 0;		val.tv_usec = vTimeOut * 1000;				fd_set TmpSet;		FD_ZERO(&TmpSet);		FD_SET(fFileDesc,&TmpSet);		err = select(fFileDesc+1, NULL,&TmpSet, NULL, &val);		if(err <=0 )		{			if(err == 0) err = EAGAIN;			return err;		}	}	//send	do 	{		err = ::send(fFileDesc, inData, inLength, 0);//flags??	} while((err == -1) && (OS::GetErrno() == EINTR));		if (err == -1)	{		//Are there any errors that can happen if the client is connected?		//Yes... EAGAIN. Means the socket is now flow-controleld		int theErr = OS::GetErrno();		if ((theErr != EAGAIN) && (this->IsConnected()))			fState ^= kConnected;//turn off connected state flag				return (OS_Error)theErr;	}		*outLengthSent = err;	return OS_NoErr;}OS_Error Socket::WriteV(const struct iovec* iov, const UInt32 numIOvecs, UInt32* outLenSent,UInt32 vTimeOut){    Assert(iov != NULL);    if (!(fState & kConnected))        return (OS_Error)ENOTCONN;	//timout calc	int err = 0;	if(vTimeOut != 0)	{		struct timeval val;		val.tv_sec = 0;		val.tv_usec = vTimeOut * 1000;				fd_set TmpSet;		FD_ZERO(&TmpSet);		FD_SET(fFileDesc,&TmpSet);		err = select(fFileDesc+1, NULL,&TmpSet, NULL, &val);		if(err <=0 )		{			if(err == 0) err = EAGAIN;			return err;		}	}    do    {#ifdef __Win32__        DWORD theBytesSent = 0;        err = ::WSASend(fFileDesc, (LPWSABUF)iov, numIOvecs, &theBytesSent, 0, NULL, NULL);        if (err == 0)            err = theBytesSent;#else       err = ::writev(fFileDesc, iov, numIOvecs);//flags??#endif    } while((err == -1) && (OS::GetErrno() == EINTR));    if (err == -1)    {        // Are there any errors that can happen if the client is connected?        // Yes... EAGAIN. Means the socket is now flow-controleld        int theErr = OS::GetErrno();        if ((theErr != EAGAIN) && (this->IsConnected()))            fState ^= kConnected;//turn off connected state flag        return (OS_Error)theErr;    }    *outLenSent = (UInt32)err;    return OS_NoErr;}OS_Error Socket::Peek(void *buffer, const UInt32 length, UInt32 *outRecvLenP){	Assert(outRecvLenP != NULL);    Assert(buffer != NULL);	    if (!(fState & kConnected))        return (OS_Error)ENOTCONN;	    //int theRecvLen = ::recv(fFileDesc, buffer, length, 0);//flags??    int theRecvLen;    do {		theRecvLen = ::recv(fFileDesc, (char*)buffer, length, MSG_PEEK);//flags??    } while((theRecvLen == -1) && (OS::GetErrno() == EINTR));	    if (theRecvLen == -1)    {        // Are there any errors that can happen if the client is connected?        // Yes... EAGAIN. Means the socket is now flow-controleld        int theErr = OS::GetErrno();        if ((theErr != EAGAIN ) && (this->IsConnected()))            fState ^= kConnected;//turn off connected state flag		        return (OS_Error)theErr;    }    //if we get 0 bytes back from read, that means the client has disconnected.    //Note that and return the proper error to the caller    else if (theRecvLen == 0)    {        fState ^= kConnected;        return (OS_Error)ENOTCONN;    }    Assert(theRecvLen > 0);    *outRecvLenP = (UInt32)theRecvLen;    return OS_NoErr;}OS_Error Socket::Read(void *buffer, const UInt32 length, UInt32 *outRecvLenP){    Assert(outRecvLenP != NULL);    Assert(buffer != NULL);    if (!(fState & kConnected))        return (OS_Error)ENOTCONN;    //int theRecvLen = ::recv(fFileDesc, buffer, length, 0);//flags??    int theRecvLen;    do {       theRecvLen = ::recv(fFileDesc, (char*)buffer, length, 0);//flags??    } while((theRecvLen == -1) && (OS::GetErrno() == EINTR));    if (theRecvLen == -1)    {        // Are there any errors that can happen if the client is connected?        // Yes... EAGAIN. Means the socket is now flow-controleld        int theErr = OS::GetErrno();        if ((theErr != EAGAIN ) && (this->IsConnected()))            fState ^= kConnected;//turn off connected state flag        return (OS_Error)theErr;    }    //if we get 0 bytes back from read, that means the client has disconnected.    //Note that and return the proper error to the caller    else if (theRecvLen == 0)    {        fState ^= kConnected;        return (OS_Error)ENOTCONN;    }    Assert(theRecvLen > 0);    *outRecvLenP = (UInt32)theRecvLen;    return OS_NoErr;}OS_Error Socket::SetNonBlocking(){#ifdef __Win32__    u_long one = 1;    int err = ::ioctlsocket(fFileDesc, FIONBIO, &one);#else    int flag = ::fcntl(fFileDesc, F_GETFL, 0);    int err = ::fcntl(fFileDesc, F_SETFL, flag | O_NONBLOCK);#endif	return err;}OS_Error Socket::SetBlocking(){#ifdef __Win32__    u_long one = 0;    int err = ::ioctlsocket(fFileDesc, FIONBIO, &one);#else    int flag = ::fcntl(fFileDesc, F_GETFL, 0);    int err = ::fcntl(fFileDesc, F_SETFL, flag & ~O_NONBLOCK);#endif		return err;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区喷汁尤物| 国产专区欧美精品| 99久久婷婷国产综合精品电影| 久久婷婷成人综合色| 韩国三级在线一区| 欧美国产成人精品| 不卡一卡二卡三乱码免费网站| 日韩码欧中文字| 欧美色欧美亚洲另类二区| 天天色天天爱天天射综合| 日韩欧美黄色影院| 国产精品一色哟哟哟| 中文字幕日本乱码精品影院| 色呦呦国产精品| 麻豆一区二区三区| 国产日韩欧美激情| 日本乱码高清不卡字幕| 老司机免费视频一区二区 | 91麻豆精品在线观看| 亚洲综合小说图片| 精品少妇一区二区三区在线播放| 国产高清在线精品| 亚洲一区在线视频| 久久一夜天堂av一区二区三区| 高清av一区二区| 亚洲超碰97人人做人人爱| 337p粉嫩大胆噜噜噜噜噜91av| 成人av电影观看| 蜜桃av一区二区在线观看| 国产精品日韩成人| 欧美一区二区三区四区视频| 成人免费毛片a| 日韩成人午夜精品| 国产精品国产三级国产a| 欧美日韩国产综合久久| 国产一区二区三区视频在线播放| 亚洲欧美日韩一区| 欧美va亚洲va在线观看蝴蝶网| 99国产一区二区三精品乱码| 蜜臀精品一区二区三区在线观看| 国产精品国产三级国产普通话蜜臀| 欧美日韩aaa| 91在线观看下载| 紧缚捆绑精品一区二区| 亚洲综合999| 国产精品免费人成网站| 日韩免费一区二区三区在线播放| 99久久精品免费看| 精品一区二区三区视频在线观看| 亚洲伊人色欲综合网| 欧美国产乱子伦 | 92国产精品观看| 久久er99热精品一区二区| 一区二区视频在线| 国产日韩欧美高清在线| 亚洲精品在线免费观看视频| 欧美日韩电影在线| 色噜噜狠狠色综合欧洲selulu| 国产福利一区二区三区视频在线| 日韩av一区二区三区四区| 亚洲一区中文在线| 亚洲欧美另类图片小说| 国产色一区二区| 久久久久久一级片| 日韩女优电影在线观看| 欧美精品第一页| 欧美亚洲一区二区在线观看| 99久久婷婷国产综合精品电影 | 另类欧美日韩国产在线| 香港成人在线视频| 亚洲国产精品久久一线不卡| 最新国产成人在线观看| 国产精品伦一区| 欧美国产成人精品| 国产精品久久久久婷婷| 国产亚洲一区二区三区在线观看| 精品乱码亚洲一区二区不卡| 91精品国产日韩91久久久久久| 欧美精品久久久久久久久老牛影院| 欧美日韩久久久| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲男人的天堂一区二区| 国产精品国产三级国产三级人妇 | 欧美日韩一级二级三级| 欧美日韩一区二区三区在线| 欧美写真视频网站| 欧美日韩激情一区二区| 91精品国产色综合久久ai换脸| 日韩精品一区二区三区中文精品| 日韩视频一区在线观看| 精品捆绑美女sm三区| 精品av综合导航| 国产精品久久久久桃色tv| 亚洲欧美日韩国产手机在线| 亚洲高清免费观看高清完整版在线观看| 夜夜嗨av一区二区三区中文字幕| 亚洲电影你懂得| 免费不卡在线视频| 国产剧情一区二区| 99久久综合国产精品| 日本韩国欧美一区二区三区| 欧美男人的天堂一二区| 精品999久久久| 专区另类欧美日韩| 日本va欧美va瓶| 国产精品亚洲综合一区在线观看| 99精品国产91久久久久久 | 精品捆绑美女sm三区| 中文字幕一区二区三区在线播放| 亚洲激情第一区| 麻豆精品一区二区三区| 东方aⅴ免费观看久久av| 在线免费观看成人短视频| 欧美一二三区在线| 国产精品视频免费| 亚洲成人动漫精品| 国产福利精品一区| 欧美性猛交一区二区三区精品| 日韩欧美一区在线| 国产精品高潮久久久久无| 日韩和欧美的一区| 成人h版在线观看| 91麻豆精品国产自产在线观看一区 | 国产成人精品免费看| 欧美制服丝袜第一页| 久久免费电影网| 日韩一区精品字幕| 99久久婷婷国产综合精品电影 | 亚洲第一在线综合网站| 国产成人免费av在线| 91精品欧美综合在线观看最新| 欧美激情在线观看视频免费| 偷窥少妇高潮呻吟av久久免费 | 欧美影片第一页| 国产色产综合色产在线视频| 视频一区二区三区入口| 99re在线精品| 久久久精品国产免大香伊| 日韩有码一区二区三区| 在线精品视频免费播放| 日本一区二区三区四区| 看国产成人h片视频| 欧美午夜电影网| 亚洲欧洲精品成人久久奇米网| 国产在线视频一区二区三区| 在线不卡一区二区| 亚洲欧美日韩在线| av福利精品导航| 久久久久久久久久久电影| 奇米在线7777在线精品 | 日韩三级电影网址| 性久久久久久久久| 欧美亚洲精品一区| 亚洲欧洲制服丝袜| 99re这里都是精品| 国产精品不卡视频| 成人ar影院免费观看视频| 国产午夜精品在线观看| 黄页视频在线91| 日韩欧美第一区| 久久www免费人成看片高清| 91精品国产综合久久精品图片 | 一区二区三区四区精品在线视频| 成人免费看的视频| 日本一区二区三级电影在线观看 | 成人性生交大合| 久久精品夜夜夜夜久久| 国产一区二区三区美女| 久久伊人蜜桃av一区二区| 韩国欧美国产一区| 久久影视一区二区| 粉嫩蜜臀av国产精品网站| 亚洲国产成人午夜在线一区| 国产精品1区二区.| 国产精品水嫩水嫩| 日本丶国产丶欧美色综合| 一区二区三区免费在线观看| 欧美午夜精品一区| 免费黄网站欧美| 久久亚洲综合色一区二区三区| 国产酒店精品激情| 最新欧美精品一区二区三区| 一本一道综合狠狠老| 亚洲风情在线资源站| 欧美一区二区三区在线电影| 国产一区视频网站| 中文字幕亚洲在| 欧美日韩在线一区二区| 免费观看91视频大全| 久久久99精品久久| 在线观看日韩一区| 麻豆一区二区三区| 国产精品毛片久久久久久| 欧美影院午夜播放| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品对白交换视频 | 日韩一区二区精品葵司在线| 激情欧美一区二区| 一区二区三区在线免费| 91精品婷婷国产综合久久|