Exemple #1
0
SOCKET connectSock(const char *host, const char *service , const char *transType)
{
	SOCKET s;
	struct sockaddr_in sockAddr;
	int type,protocol;
	struct hostent	*phe;	
	struct servent	*pse;	

	memset(&sockAddr,0,sizeof(sockAddr));
	sockAddr.sin_family = AF_INET;

	if (pse = getservbyname(service,transType))				//如果service输入是服务名称
	{
		sockAddr.sin_port = pse->s_port;
	}

	else if( (sockAddr.sin_port = htons((u_short)atoi(service)) )== 0)			//如果service输入是端口号
	{
		fprintf(stderr,"Can't get \"%s\" port number or service entry\n", service);
		return INVALID_SOCKET;
	}

	if (phe = gethostbyname(host))													//如果host输入是域名
	{
		memcpy(&sockAddr.sin_addr , phe->h_addr, phe->h_length);
	}
	
	else if ( (sockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)						//host是IP地址
	{
		fprintf(stderr,"Can't get \"%s\" IP address or host entry \n", host);
		return INVALID_SOCKET;
	}

	if (strcmp(transType, "udp") == 0)
	{
		type = SOCK_DGRAM;
		protocol = IPPROTO_UDP;
	}
	else
	{
		type = SOCK_STREAM;
		protocol = IPPROTO_TCP;
	}

	if (	(s = socket(AF_INET , type ,protocol)) == INVALID_SOCKET)           //初始化s
	{
		sockError("Can't create socket!");
		return INVALID_SOCKET;
	}
	
	if (connect(s, (struct sockaddr *)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)
	{
		fprintf(stderr,"Can't connect to %s.%s:\n",  host, service);
		sockError("");
		return INVALID_SOCKET;
	}
	return s;

}
Exemple #2
0
SOCKET passiveSock(const char *service , const char *transType , int qlen)						//建立被动套接字
{
	SOCKET s;
	struct sockaddr_in sockAddr;
	int type,protocol;
	struct servent	*pse;

	memset(&sockAddr,0 ,sizeof(sockAddr));
	sockAddr.sin_family = AF_INET;
	sockAddr.sin_addr.s_addr = INADDR_ANY;

	if ( pse =getservbyname(service ,transType))					//如果是服务名称
	{
		sockAddr.sin_port = pse->s_port ;
	}

	else if ( (sockAddr.sin_port = htons((u_short)atoi(service))) ==0)
	{
		fprintf(stderr,"Can't get \"%s\" port number or service entry\n", service);
		return INVALID_SOCKET;
	}
	
	if (strcmp(transType, "udp") == 0)
	{
		type = SOCK_DGRAM;
		protocol = IPPROTO_UDP;
	}
	else
	{
		type = SOCK_STREAM;
		protocol = IPPROTO_TCP;
	}

	if ((s = socket(AF_INET,type,protocol)) == INVALID_SOCKET)   //初始化
	{
		sockError("Can't create socket!");
		return INVALID_SOCKET;
	}

	if (bind(s,(struct sockaddr *)&sockAddr,sizeof(sockAddr)) == SOCKET_ERROR) //绑定
	{
		fprintf(stderr,"Can't bind to port: %d \n",  service);
		sockError("");
		return INVALID_SOCKET;
	}

	if (type == SOCK_STREAM && listen(s,qlen) == SOCKET_ERROR)				//如果是TCP监听
	{
		fprintf(stderr,"Can't listen to port: %d \n",  service);
		sockError("");
		return INVALID_SOCKET;
	}
	return s;

}
Exemple #3
0
long pnSocket::peek(void* buffer, size_t size)
{
    long count = ::recv(fSockHandle, (sockbuf_t)buffer, size, MSG_PEEK);
    if (count == -1 && sockError() != ECONNRESET)
        plDebug::Error("Peek failed: {}", getSockErrorStr());
    return count;
}
Exemple #4
0
bool Socket::readChunk()
{
	dataBegin = dataEnd = 0;
	
	int r = recv(s, staticBuffer, 1024, 0);
	if(r != -1)
	{
		if(r == 0)
		{
			connected = false;
			return true; // No more data
		}
		dataBegin = staticBuffer;
		dataEnd = staticBuffer + r;
		resetTimer();
	}
	else if(sockError() != EWOULDBLOCK)
	{
		error = ErrorRecv;
		return true; // Error
	}
	else
	{
		checkTimeout();
	}
	
	return error != ErrorNone;
}
Exemple #5
0
bool Socket::trySend(char const*& b, char const* e)
{
	assert(b <= e);
	
	if(b == e)
		return true;
		
	int sent = ::send(s, b, e - b, 0);
	if(sent == -1)
	{
		if(sockError() != EWOULDBLOCK) // Error
		{
			error = ErrorSend;
			return true;
		}
		else
			checkTimeout();
	}
	else
	{
		b += sent;
		if(b == e)
			return true;
	}
	
	return error != ErrorNone;
}
Exemple #6
0
long pnSocket::recv(void* buffer, size_t size)
{
    long count = ::recv(fSockHandle, (sockbuf_t)buffer, size, 0);
    if (count == -1 && sockError() != ECONNRESET) {
        plDebug::Error("Recv failed: {}", getSockErrorStr());
        close();
    }
    return count;
}