⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbian_net.cpp

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	i = listen(sock->socket, MaxConnection);	if (i == SOCKET_ERROR) return GF_IP_NETWORK_FAILURE;	sock->flags |= GF_SOCK_IS_LISTENING;	return GF_OK;}GF_Err gf_sk_accept(GF_Socket *sock, GF_Socket **newConnection){	u32 client_address_size;	SOCKET sk;#ifndef __SYMBIAN32__	u32 ready;	struct timeval timeout;	fd_set Group;#endif#ifndef __SYMBIAN32__	u32 res;	#endif	*newConnection = NULL;	if (!sock || !(sock->flags & GF_SOCK_IS_LISTENING) ) return GF_BAD_PARAM;#ifndef __SYMBIAN32__	//can we read?	FD_ZERO(&Group);	FD_SET(sock->socket, &Group);	timeout.tv_sec = 0;	timeout.tv_usec = SOCK_MICROSEC_WAIT;	res = 0;	ready = select(sock->socket, &Group, NULL, NULL, &timeout);	if (ready == SOCKET_ERROR) {		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}	}	if (!ready || !FD_ISSET(sock->socket, &Group)) return GF_IP_NETWORK_EMPTY;#endif#ifdef GPAC_IPV6	client_address_size = sizeof(struct sockaddr_in6);#else	client_address_size = sizeof(struct sockaddr_in);#endif	sk = accept(sock->socket, (struct sockaddr *) &sock->dest_addr, &client_address_size);	//we either have an error or we have no connections	if (sk == INVALID_SOCKET) {//		if (sock->flags & GF_SOCK_NON_BLOCKING) return GF_IP_NETWORK_FAILURE;		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}			}	(*newConnection) = (GF_Socket *) malloc(sizeof(GF_Socket));	(*newConnection)->socket = sk;	(*newConnection)->flags = sock->flags & ~GF_SOCK_IS_LISTENING;#ifdef GPAC_IPV6	memcpy( &(*newConnection)->dest_addr, &sock->dest_addr, client_address_size);	memset(&sock->dest_addr, 0, sizeof(struct sockaddr_in6));#else	memcpy( &(*newConnection)->dest_addr, &sock->dest_addr, client_address_size);	memset(&sock->dest_addr, 0, sizeof(struct sockaddr_in));#endif	(*newConnection)->dest_addr_len = client_address_size;	return GF_OK;}GF_Err gf_sk_get_local_info(GF_Socket *sock, u16 *Port, u32 *Familly){#ifdef GPAC_IPV6	struct sockaddr_in6 the_add;#else	struct sockaddr_in the_add;#endif	u32 size;	if (!sock || !sock->socket) return GF_BAD_PARAM;	if (Port) {#ifdef GPAC_IPV6		size = sizeof(struct sockaddr_in6);		if (getsockname(sock->socket, (struct sockaddr *) &the_add, &size) == SOCKET_ERROR) return GF_IP_NETWORK_FAILURE;		*Port = (u32) ntohs(the_add.sin6_port);#else		size = sizeof(struct sockaddr_in);		if (getsockname(sock->socket, (struct sockaddr *) &the_add, &size) == SOCKET_ERROR) return GF_IP_NETWORK_FAILURE;		*Port = (u32) ntohs(the_add.sin_port);#endif	}	if (Familly) {/*		size = 4;		if (getsockopt(sock->socket, SOL_SOCKET, SO_TYPE, (char *) &fam, &size) == SOCKET_ERROR)			return GF_IP_NETWORK_FAILURE;		*Familly = fam;*/		if (sock->flags & GF_SOCK_IS_TCP) *Familly = GF_SOCK_TYPE_TCP;		else  *Familly = GF_SOCK_TYPE_UDP;	}	return GF_OK;}//we have to do this for the server sockets as we use only one thread GF_Err gf_sk_server_mode(GF_Socket *sock, Bool serverOn){	u32 one;	if (!sock || !(sock->flags & GF_SOCK_IS_TCP) || !sock->socket)		return GF_BAD_PARAM;	one = serverOn ? 1 : 0;	setsockopt(sock->socket, IPPROTO_TCP, TCP_NODELAY, SSO_CAST &one, sizeof(u32));#ifndef __SYMBIAN32__	setsockopt(sock->socket, SOL_SOCKET, SO_KEEPALIVE, (char *) &one, sizeof(u32));#endif	return GF_OK;}GF_Err gf_sk_get_remote_address(GF_Socket *sock, char *buf){#ifdef GPAC_IPV6	char clienthost[NI_MAXHOST]; 	struct sockaddr_in6 * addrptr = (struct sockaddr_in6 *)(&sock->dest_addr_len);	if (!sock || sock->socket) return GF_BAD_PARAM;	if (getnameinfo((struct sockaddr *)addrptr, sock->dest_addr_len, clienthost, sizeof(clienthost), NULL, 0, NI_NUMERICHOST)) 		return GF_IP_ADDRESS_NOT_FOUND;	strcpy(buf, clienthost);#else	if (!sock || !sock->socket) return GF_BAD_PARAM;	strcpy(buf, inet_ntoa(sock->dest_addr.sin_addr));#endif	return GF_OK;	}//send length bytes of a bufferGF_Err gf_sk_send_to(GF_Socket *sock, char *buffer, u32 length, char *remoteHost, u16 remotePort){	u32 Count, remote_add_len;	s32 Res;#ifdef GPAC_IPV6	struct sockaddr_storage remote_add;#else	struct sockaddr_in remote_add;	struct hostent *Host;#endif#ifndef __SYMBIAN32__	u32 ready;	struct timeval timeout;	fd_set Group;#endif	//the socket must be bound or connected	if (!sock || !sock->socket) return GF_BAD_PARAM;	if (remoteHost && !remotePort) return GF_BAD_PARAM;#ifndef __SYMBIAN32__	//can we write?	FD_ZERO(&Group);	FD_SET(sock->socket, &Group);	timeout.tv_sec = 0;	timeout.tv_usec = SOCK_MICROSEC_WAIT;	ready = select(sock->socket+1, NULL, &Group, NULL, &timeout);	if (ready == SOCKET_ERROR) {		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}	}	if (!ready || !FD_ISSET(sock->socket, &Group)) return GF_IP_NETWORK_EMPTY;#endif	/*setup the address*/#ifdef GPAC_IPV6	remote_add.ss_family = AF_INET6;	//if a remote host is specified, use it. Otherwise use the default host	if (remoteHost) {		//setup the address		struct addrinfo *res = gf_sk_get_ipv6_addr(remoteHost, remotePort, AF_UNSPEC, 0, (sock->flags & GF_SOCK_IS_TCP) ? SOCK_STREAM : SOCK_DGRAM);		if (!res) return GF_IP_ADDRESS_NOT_FOUND;		memcpy(&remote_add, res->ai_addr, res->ai_addrlen);		remote_add_len = res->ai_addrlen;		freeaddrinfo(res);	} else {		struct sockaddr_in6 *remotePtr = (struct sockaddr_in6 *)&remote_add;	 	struct sockaddr_in6 * addrptr = (struct sockaddr_in6 *)(&sock->dest_addr);		remotePtr->sin6_port = addrptr->sin6_port;		remotePtr->sin6_addr = addrptr->sin6_addr;		remote_add_len = sock->dest_addr_len;	}#else	remote_add_len = sizeof(struct sockaddr_in);	remote_add.sin_family = AF_INET;	//if a remote host is specified, use it. Otherwise use the default host	if (remoteHost) {		//setup the address		remote_add.sin_port = htons(remotePort);		//get the server IP		Host = gethostbyname(remoteHost);		if (Host == NULL) return GF_IP_ADDRESS_NOT_FOUND;		memcpy((char *) &remote_add.sin_addr, Host->h_addr_list[0], sizeof(u32));	} else {		remote_add.sin_port = sock->dest_addr.sin_port;		remote_add.sin_addr.s_addr = sock->dest_addr.sin_addr.s_addr;	}#endif			Count = 0;	while (Count < length) {		Res = sendto(sock->socket, (char *) &buffer[Count], length - Count, 0, (struct sockaddr *) &remote_add, remote_add_len); 				if (Res == SOCKET_ERROR) {			switch (LASTSOCKERROR) {			case EAGAIN:				return GF_IP_SOCK_WOULD_BLOCK;			default:				return GF_IP_NETWORK_FAILURE;			}		}		Count += Res;	}	return GF_OK;}GF_Err gf_sk_receive_wait(GF_Socket *sock, char *buffer, u32 length, u32 startFrom, u32 *BytesRead, u32 Second ){	GF_Err e;	s32 res;#ifndef __SYMBIAN32__	u32 ready;	struct timeval timeout;	fd_set Group;#endif	e = GF_OK;	*BytesRead = 0;	if (startFrom >= length) return GF_OK;#ifndef __SYMBIAN32__	//can we read?	FD_ZERO(&Group);	FD_SET(sock->socket, &Group);	timeout.tv_sec = Second;	timeout.tv_usec = SOCK_MICROSEC_WAIT;	res = 0;	ready = select(sock->socket+1, &Group, NULL, NULL, &timeout);	if (ready == SOCKET_ERROR) {		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}	}	if (!FD_ISSET(sock->socket, &Group)) {		return GF_IP_NETWORK_EMPTY;	}#endif	res = recv(sock->socket, (char *) buffer + startFrom, length - startFrom, 0);	if (res == SOCKET_ERROR) {		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}	}	*BytesRead = res;	return GF_OK;}//send length bytes of a bufferGF_Err gf_sk_send_wait(GF_Socket *sock, char *buffer, u32 length, u32 Second ){	GF_Err e;	u32 Count;	s32 Res;#ifndef __SYMBIAN32__	u32 ready;	struct timeval timeout;	fd_set Group;#endif	e = GF_OK;	//the socket must be bound or connected	if (!sock || !sock->socket) return GF_BAD_PARAM;#ifndef __SYMBIAN32__	//can we write?	FD_ZERO(&Group);	FD_SET(sock->socket, &Group);	timeout.tv_sec = Second;	timeout.tv_usec = SOCK_MICROSEC_WAIT;	ready = select(sock->socket+1, NULL, &Group, NULL, &timeout);	if (ready == SOCKET_ERROR) {		switch (LASTSOCKERROR) {		case EAGAIN:			return GF_IP_SOCK_WOULD_BLOCK;		default:			return GF_IP_NETWORK_FAILURE;		}	}	//should never happen (to check: is writeability is guaranteed for not-connected sockets)	if (!ready || !FD_ISSET(sock->socket, &Group)) {		return GF_IP_NETWORK_EMPTY;	}#endif	//direct writing	Count = 0;	while (Count < length) {		Res = send(sock->socket, (char *) &buffer[Count], length - Count, 0);		if (Res == SOCKET_ERROR) {			switch (LASTSOCKERROR) {			case EAGAIN:				return GF_IP_SOCK_WOULD_BLOCK;#ifndef __SYMBIAN32__			case ECONNRESET: 				return GF_IP_CONNECTION_CLOSED;#endif			default:				return GF_IP_NETWORK_FAILURE;			}		}		Count += Res;	}	return GF_OK;}#if 0//Socket Group for select(). The group is a collection of sockets ready for reading / writingtypedef struct __tag_sock_group{	//the max time value before a select returns	struct timeval timeout;	fd_set ReadGroup;	fd_set WriteGroup;} GF_SocketGroup;#define GF_SOCK_GROUP_READ 0#define GF_SOCK_GROUP_WRITE 1GF_SocketGroup *NewSockGroup(){		GF_SocketGroup *tmp = (GF_SocketGroup*)malloc(sizeof(GF_SocketGroup));	if (!tmp) return NULL;	FD_ZERO(&tmp->ReadGroup);	FD_ZERO(&tmp->WriteGroup);	return tmp;}void SKG_Delete(GF_SocketGroup *group){	free(group);}void SKG_SetWatchTime(GF_SocketGroup *group, u32 DelayInS, u32 DelayInMicroS){	group->timeout.tv_sec = DelayInS;	group->timeout.tv_usec = DelayInMicroS;}void SKG_AddSocket(GF_SocketGroup *group, GF_Socket *sock, u32 GroupType){	switch (GroupType) {	case GF_SOCK_GROUP_READ:		FD_SET(sock->socket, &group->ReadGroup);		return;	case GF_SOCK_GROUP_WRITE:		FD_SET(sock->socket, &group->WriteGroup);		return;	default:		return;	}}void SKG_RemoveSocket(GF_SocketGroup *group, GF_Socket *sock, u32 GroupType){	switch (GroupType) {	case GF_SOCK_GROUP_READ:		FD_CLR(sock->socket, &group->ReadGroup);		return;	case GF_SOCK_GROUP_WRITE:		FD_CLR(sock->socket, &group->WriteGroup);		return;	default:		return;	}}Bool SKG_IsSocketIN(GF_SocketGroup *group, GF_Socket *sock, u32 GroupType){	switch (GroupType) {	case GF_SOCK_GROUP_READ:		if (FD_ISSET(sock->socket, &group->ReadGroup)) return 1;		return 0;	case GF_SOCK_GROUP_WRITE:		if (FD_ISSET(sock->socket, &group->WriteGroup)) return 1;		return 0;	default:		return 0;	}}u32 SKG_Select(GF_SocketGroup *group){	u32 ready, rien = 0;	ready = select(rien, &group->ReadGroup, &group->WriteGroup, NULL, &group->timeout);	if (ready == SOCKET_ERROR) return 0;	return ready;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -