📄 symbian_net.cpp
字号:
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 + -