BOOL cg_upnp_ssdpresponse_server_post(CgUpnpSSDPResponseServer *server, CgUpnpSSDPRequest *ssdpReq) { CgUpnpHttpUSocket *httpuSock; char *ifAddr; const char *ssdpAddr; CgString *ssdpMsg; size_t sentLen = 0; cg_log_debug_l4("Entering...\n"); httpuSock = cg_upnp_ssdpresponse_server_getsocket(server); ifAddr = cg_socket_getaddress(httpuSock); ssdpAddr = cg_upnp_ssdp_gethostaddress(ifAddr); cg_upnp_ssdprequest_sethost(ssdpReq, ssdpAddr, CG_UPNP_SSDP_PORT); ssdpMsg = cg_string_new(); cg_upnp_ssdprequest_tostring(ssdpReq, ssdpMsg); sentLen = cg_socket_sendto(httpuSock, ssdpAddr, CG_UPNP_SSDP_PORT, cg_string_getvalue(ssdpMsg), cg_string_length(ssdpMsg)); cg_string_delete(ssdpMsg); cg_log_debug_l4("Leaving...\n"); return (sentLen > 0); }
int cg_socket_recv(CgSocket *sock, CgDatagramPacket *dgmPkt) { int recvLen = 0; char recvBuf[CG_NET_SOCKET_DGRAM_RECV_BUFSIZE+1]; char remoteAddr[CG_NET_SOCKET_MAXHOST]; char remotePort[CG_NET_SOCKET_MAXSERV]; char *localAddr; #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) struct sockaddr_in from; W fromLen = sizeof(from); recvLen = so_recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) struct sockaddr_in from; int fromLen = sizeof(from); recvLen = ka_recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen); #elif defined(ITRON) T_IPV4EP remoteHost; recvLen = udp_rcv_dat(sock->id, &remoteHost, recvBuf, sizeof(recvBuf)-1, TMO_FEVR); #else struct sockaddr_storage from; socklen_t fromLen = sizeof(from); recvLen = recvfrom(sock->id, recvBuf, sizeof(recvBuf)-1, 0, (struct sockaddr *)&from, &fromLen); #endif cg_log_debug_l4("Entering...\n"); if (recvLen <= 0) return 0; recvBuf[recvLen] = '\0'; cg_socket_datagram_packet_setdata(dgmPkt, recvBuf); cg_socket_datagram_packet_setlocalport(dgmPkt, cg_socket_getport(sock)); cg_socket_datagram_packet_setremoteaddress(dgmPkt, ""); cg_socket_datagram_packet_setremoteport(dgmPkt, 0); #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock)); cg_socket_datagram_packet_setremoteaddress(dgmPkt, inet_ntoa(from.sin_addr)); cg_socket_datagram_packet_setremoteport(dgmPkt, ntohl(from.sin_port)); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock)); ka_tfInetToAscii((unsigned long)from.sin_addr.s_addr, remoteAddr); cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr); cg_socket_datagram_packet_setremoteport(dgmPkt, ka_ntohl(from.sin_port)); #elif defined(ITRON) cg_socket_datagram_packet_setlocaladdress(dgmPkt, cg_socket_getaddress(sock)); ipaddr_to_ascii(remoteAddr, remoteHost.ipaddr); cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr); cg_socket_datagram_packet_setremoteport(dgmPkt, ntohs(remoteHost.portno)); #else if (getnameinfo((struct sockaddr *)&from, fromLen, remoteAddr, sizeof(remoteAddr), remotePort, sizeof(remotePort), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { cg_socket_datagram_packet_setremoteaddress(dgmPkt, remoteAddr); cg_socket_datagram_packet_setremoteport(dgmPkt, atol(remotePort)); } cg_log_debug_s("From pointer %p\n", &from); localAddr = cg_net_selectaddr((struct sockaddr *)&from); cg_socket_datagram_packet_setlocaladdress(dgmPkt, localAddr); free(localAddr); #endif cg_log_debug_l4("Leaving...\n"); return recvLen; }
BOOL cg_socket_accept(CgSocket *serverSock, CgSocket *clientSock) { struct sockaddr_in sockaddr; socklen_t socklen; char localAddr[CG_NET_SOCKET_MAXHOST]; char localPort[CG_NET_SOCKET_MAXSERV]; #if defined(BTRON) || (defined(TENGINE) && !defined(CG_TENGINE_NET_KASAGO)) struct sockaddr_in sockaddr; W nLength = sizeof(struct sockaddr_in); cg_socket_setid(clientSock, so_accept(serverSock->id, (SOCKADDR *)&sockaddr, &nLength)); #elif defined(TENGINE) && defined(CG_TENGINE_NET_KASAGO) struct sockaddr_in sockaddr; int nLength = sizeof(struct sockaddr_in); cg_socket_setid(clientSock, ka_accept(serverSock->id, (struct sockaddr *)&sockaddr, &nLength)); #elif defined(ITRON) T_IPV4EP dstAddr; if (tcp_acp_cep(serverSock->id, serverSock->id, &dstAddr, TMO_FEVR) != E_OK) return FALSE; cg_socket_setid(clientSock, cg_socket_getid(serverSock)); #else struct sockaddr_storage sockClientAddr; socklen_t nLength = sizeof(sockClientAddr); cg_socket_setid(clientSock, accept(serverSock->id, (struct sockaddr *)&sockClientAddr, &nLength)); #endif cg_log_debug_l4("Entering...\n"); #ifdef SOCKET_DEBUG cg_log_debug_s("clientSock->id = %d\n", clientSock->id); #endif #if defined (WIN32) && !defined(ITRON) if (clientSock->id == INVALID_SOCKET) return FALSE; #else if (clientSock->id < 0) return FALSE; #endif cg_socket_setaddress(clientSock, cg_socket_getaddress(serverSock)); cg_socket_setport(clientSock, cg_socket_getport(serverSock)); socklen = sizeof(struct sockaddr_in); if (getsockname(clientSock->id, (struct sockaddr *)&sockaddr, &socklen) == 0 && getnameinfo((struct sockaddr *)&sockaddr, socklen, localAddr, sizeof(localAddr), localPort, sizeof(localPort), NI_NUMERICHOST | NI_NUMERICSERV) == 0) { /* Set address for the sockaddr to real addr */ cg_socket_setaddress(clientSock, localAddr); } #ifdef SOCKET_DEBUG cg_log_debug_s("clientSock->id = %s\n", cg_socket_getaddress(clientSock)); cg_log_debug_s("clientSock->id = %d\n", cg_socket_getport(clientSock)); #endif return TRUE; cg_log_debug_l4("Leaving...\n"); }