4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Yong Yeon Kim <yy9875.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 * This file defines api utilities of IPC.
25 * @file media-util-ipc.c
26 * @author Haejeong Kim(backto.kim@samsung.com)
35 #include "media-util-dbg.h"
36 #include "media-util.h"
38 int ms_ipc_create_client_socket(ms_protocol_e protocol, int timeout_sec, int *sock_fd)
42 struct timeval tv_timeout = { timeout_sec, 0 };
44 if(protocol == MS_PROTOCOL_UDP)
46 /* Create a datagram/UDP socket */
47 if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
48 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
49 return MS_MEDIA_ERR_SOCKET_CONN;
55 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
56 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
57 return MS_MEDIA_ERR_SOCKET_CONN;
61 if (timeout_sec > 0) {
62 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv_timeout, sizeof(tv_timeout)) == -1) {
63 MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno));
65 return MS_MEDIA_ERR_SOCKET_CONN;
71 return MS_MEDIA_ERR_NONE;
74 int ms_ipc_create_server_socket(ms_protocol_e protocol, int port, int *sock_fd)
78 struct sockaddr_in serv_addr;
79 unsigned short serv_port;
83 if(protocol == MS_PROTOCOL_UDP)
85 /* Create a datagram/UDP socket */
86 if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
87 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
88 return MS_MEDIA_ERR_SOCKET_CONN;
93 /* Create a TCP socket */
94 if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
95 MSAPI_DBG_ERR("socket failed: %s", strerror(errno));
96 return MS_MEDIA_ERR_SOCKET_CONN;
100 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &n_reuse, sizeof(n_reuse)) == -1) {
101 MSAPI_DBG_ERR("setsockopt failed: %s", strerror(errno));
103 return MS_MEDIA_ERR_SOCKET_INTERNAL;
106 memset(&serv_addr, 0, sizeof(serv_addr));
107 serv_addr.sin_family = AF_INET;
108 // serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
109 serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
110 serv_addr.sin_port = htons(serv_port);
112 /* Bind to the local address */
113 if (bind(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
114 MSAPI_DBG_ERR("bind failed : %s", strerror(errno));
116 return MS_MEDIA_ERR_SOCKET_CONN;
119 MSAPI_DBG("bind success");
122 if (protocol == MS_PROTOCOL_TCP) {
123 if (listen(sock, SOMAXCONN) < 0) {
124 MSAPI_DBG_ERR("listen failed : %s", strerror(errno));
126 return MS_MEDIA_ERR_SOCKET_CONN;
129 MSAPI_DBG("Listening...");
134 return MS_MEDIA_ERR_NONE;
137 int ms_ipc_send_msg_to_server(int sockfd, int port, ms_comm_msg_s *send_msg, struct sockaddr_in *serv_addr)
139 int res = MS_MEDIA_ERR_NONE;
140 struct sockaddr_in addr;
142 /* Set server Address */
143 memset(&addr, 0, sizeof(addr));
144 addr.sin_family = AF_INET;
145 addr.sin_addr.s_addr = inet_addr(SERVER_IP);
146 addr.sin_port = htons(port);
148 if (sendto(sockfd, send_msg, sizeof(*(send_msg)), 0, (struct sockaddr *)&addr, sizeof(addr)) != sizeof(*(send_msg))) {
149 MSAPI_DBG_ERR("sendto failed [%s]", strerror(errno));
150 res = MS_MEDIA_ERR_SOCKET_SEND;
152 MSAPI_DBG("sent %d", send_msg->result);
153 MSAPI_DBG("sent %s", send_msg->msg);
154 if (serv_addr != NULL)
161 int ms_ipc_send_msg_to_client(int sockfd, ms_comm_msg_s *send_msg, struct sockaddr_in *client_addr)
163 int res = MS_MEDIA_ERR_NONE;
165 if (sendto(sockfd, send_msg, sizeof(*(send_msg)), 0, (struct sockaddr *)client_addr, sizeof(*(client_addr))) != sizeof(*(send_msg))) {
166 MSAPI_DBG_ERR("sendto failed [%s]", strerror(errno));
167 res = MS_MEDIA_ERR_SOCKET_SEND;
169 MSAPI_DBG("sent %d", send_msg->result);
170 MSAPI_DBG("sent %s", send_msg->msg);
173 return MS_MEDIA_ERR_NONE;
176 int ms_ipc_receive_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_in *recv_addr, unsigned int *addr_size)
179 struct sockaddr_in addr;
183 return MS_MEDIA_ERR_INVALID_PARAMETER;
185 addr_len = sizeof(struct sockaddr_in);
187 if ((recv_msg_size = recvfrom(sockfd, recv_msg, msg_size, 0, (struct sockaddr *)&addr, &addr_len)) < 0) {
188 MSAPI_DBG_ERR("recvfrom failed [%s]", strerror(errno));
189 return MS_MEDIA_ERR_SOCKET_RECEIVE;
192 if (recv_addr != NULL)
194 if (addr_size != NULL)
195 *addr_size = addr_len;
197 return MS_MEDIA_ERR_NONE;
200 int ms_ipc_wait_message(int sockfd, void *recv_msg, unsigned int msg_size, struct sockaddr_in *recv_addr, unsigned int *addr_size)
205 if (!recv_msg ||!recv_addr)
206 return MS_MEDIA_ERR_INVALID_PARAMETER;
208 addr_len = sizeof(struct sockaddr_in);
210 if ((recv_msg_size = recvfrom(sockfd, recv_msg, msg_size, 0, (struct sockaddr *)recv_addr, &addr_len)) < 0) {
211 MSAPI_DBG_ERR("recvfrom failed [%s]", strerror(errno));
212 if (errno == EWOULDBLOCK) {
213 MSAPI_DBG_ERR("recvfrom Timeout.");
214 return MS_MEDIA_ERR_SOCKET_RECEIVE_TIMEOUT;
216 MSAPI_DBG_ERR("recvfrom error [%s]", strerror(errno));
217 return MS_MEDIA_ERR_SOCKET_RECEIVE;
221 if (addr_size != NULL)
222 *addr_size = addr_len;
224 return MS_MEDIA_ERR_NONE;