int ret = MDGD_ERROR_NONE;
int sock;
struct sockaddr_in serveraddr;
+ struct sockaddr_in6 serveraddr_v6;
int retval;
mdgd_command_t *cmd = (mdgd_command_t *)user_data;
long num_read;
char buf[MAXBUF];
long total_bytes;
char tempaddr[26] = {0,};
- char *tmpaddr;
LOG_BEGIN();
goto SEND_THREAD_EXIT;
}
- sock = socket(AF_INET, SOCK_STREAM, 0);
+ /* create socket */
+ if (cmd->conn_type & CT_IP_USE_V6)
+ sock = socket(AF_INET6, SOCK_STREAM, 0);
+ else
+ sock = socket(AF_INET, SOCK_STREAM, 0);
+
if(sock < 0) {
LOG_ERR("socket() error");
ret = MDGD_ERROR_OPERATION_FAILED;
goto SEND_THREAD_EXIT;
}
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_port = htons(PORT);
+ if (cmd->conn_type & CT_IP_USE_V6) {
+ serveraddr_v6.sin6_family = AF_INET6;
+ serveraddr_v6.sin6_port = htons(PORT);
+ serveraddr_v6.sin6_flowinfo = 0;
+ serveraddr_v6.sin6_scope_id = if_nametoindex("wlan0");
+
+ sscanf(cmd->addr, "coaps://[%s", &tempaddr);
+ strtok(tempaddr, "%");
+
+ inet_pton(AF_INET6, tempaddr, &serveraddr_v6.sin6_addr);
+ retval = connect(sock, (struct sockaddr*)&serveraddr_v6, sizeof(serveraddr_v6));
+ } else {
+ serveraddr.sin_family = AF_INET;
+ serveraddr.sin_port = htons(PORT);
- sscanf(cmd->addr, "coaps://%s", &tempaddr);
- strtok(tempaddr, ":");
+ sscanf(cmd->addr, "coaps://%s", &tempaddr);
+ strtok(tempaddr, ":");
- inet_pton(AF_INET, tempaddr, &serveraddr.sin_addr.s_addr);
- retval = connect(sock, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
+ inet_pton(AF_INET, tempaddr, &serveraddr.sin_addr.s_addr);
+ retval = connect(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
+ }
+
+ LOG_DEBUG("Connect to %s. Sending %s file...", tempaddr, cmd->arg1);
+
+ /* connect */
if(retval < 0) {
LOG_ERR("connect() error : %s", strerror(errno));
ret = MDGD_ERROR_OPERATION_FAILED;
goto SEND_THREAD_EXIT;
}
- LOG_DEBUG("Connect to %s. Sending %s file...", tempaddr, cmd->arg1);
+
fd = fopen(cmd->arg1, "rb");
if(fd == NULL) {
case MDGD_REQ_SEND_FILE:
rep.setValue("file_path", std::string(cmd->arg1));
cmd->addr = g_strdup(resource->host().c_str());
+ cmd->conn_type = resource->connectivityType();
+
+ if (cmd->conn_type & CT_IP_USE_V6) {
+ rep.setValue("conn_type", std::string("V6"));
+ LOG_DEBUG("The connection type is IPv6");
+ } else {
+ rep.setValue("conn_type", std::string("V4"));
+ LOG_DEBUG("The connection type is IPv4");
+ }
+
break;
case MDGD_REQ_SEND_DATA:
{
auto found_cb = std::bind (&_found_resource, std::placeholders::_1, cmd);
- ret = OCPlatform::findResource("", requestURI.str(), CT_IP_USE_V4, found_cb);
+ ret = OCPlatform::findResource("", requestURI.str(), CT_ADAPTER_IP, found_cb);
} catch (OCException &e) {
LOG_ERR("Failed to find resource %s", e.what());
{
LOG_BEGIN();
- int server_sockfd;
- int client_sockfd;
+ int server_sockfd, client_sockfd;
int fd;
struct sockaddr_in serveraddr, clientaddr;
+ struct sockaddr_in6 serveraddr_v6, clientaddr_v6;
char client_ipaddr[INET_ADDRSTRLEN];
+ char client_ipaddr_v6[INET6_ADDRSTRLEN];
int read_len, file_read_len;
socklen_t client_len;
struct linger ling;
mdgd_receive_file_t *receive_file = (mdgd_receive_file_t *)user_data;
+ struct timeval tv_timeo = { 3, 0 };
if (receive_file == NULL) {
LOG_ERR("receive_file is NULL");
LOG_ERR("receive_file->device_id is NULL");
goto RECEIVE_THREAD_EXIT;
}
+ if (receive_file->conn_type == NULL) {
+ LOG_ERR("receive_file->conn_type is NULL");
+ goto RECEIVE_THREAD_EXIT;
+ }
LOG_DEBUG("file path : %s", receive_file->file_path);
ling.l_onoff = 1;
ling.l_linger = 0;
- client_len = sizeof(clientaddr);
+ if (g_strcmp0(receive_file->conn_type, "V6") == 0)
+ server_sockfd = socket(AF_INET6, SOCK_STREAM, 0);
+ else
+ server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
- server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(server_sockfd == -1) {
LOG_ERR("socket error : %s", strerror(errno));
goto RECEIVE_THREAD_EXIT;
}
+ setsockopt(server_sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeo, sizeof(tv_timeo));
setsockopt(server_sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
- bzero(&serveraddr, sizeof(serveraddr));
- serveraddr.sin_family = AF_INET;
- serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
- serveraddr.sin_port = htons(PORT);
+ if (g_strcmp0(receive_file->conn_type, "V6") == 0) {
+ bzero(&serveraddr_v6, sizeof(serveraddr_v6));
+ serveraddr_v6.sin6_family = AF_INET6;
+ serveraddr_v6.sin6_addr = in6addr_any;
+ serveraddr_v6.sin6_port = htons(PORT);
+ serveraddr_v6.sin6_flowinfo = 0;
+ serveraddr_v6.sin6_scope_id = if_nametoindex("wlan0");
+
+ if (bind(server_sockfd, (struct sockaddr *)&serveraddr_v6, sizeof(serveraddr_v6)) < 0) {
+ LOG_ERR("bind error : %s", strerror(errno));
+ goto RECEIVE_THREAD_EXIT;
+ }
+ } else {
+ serveraddr.sin_family = AF_INET;
+ serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ serveraddr.sin_port = htons(PORT);
- if (bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) {
- LOG_ERR("bind error : %s", strerror(errno));
- goto RECEIVE_THREAD_EXIT;
+ if (bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) {
+ LOG_ERR("bind error : %s", strerror(errno));
+ goto RECEIVE_THREAD_EXIT;
+ }
}
if (listen(server_sockfd, 5) != 0) {
goto RECEIVE_THREAD_EXIT;
}
- client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len);
- inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, client_ipaddr, sizeof(client_ipaddr));
+ if (g_strcmp0(receive_file->conn_type, "V6") == 0) {
+ client_len = sizeof(clientaddr_v6);
+ client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr_v6, &client_len);
+ inet_ntop(AF_INET6, &clientaddr_v6.sin6_addr, client_ipaddr_v6, sizeof(client_ipaddr_v6));
+ LOG_DEBUG("Accepted IP : %s, client socket : %d", client_ipaddr_v6, client_sockfd);
+ } else {
+ client_len = sizeof(clientaddr);
+ client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len);
+ inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, client_ipaddr, sizeof(client_ipaddr));
+ LOG_DEBUG("Accepted IP : %s, client socket : %d", client_ipaddr);
+ }
- LOG_DEBUG("Accepted IP : %s", client_ipaddr);
+ if(client_sockfd == -1) {
+ LOG_ERR("socket error : %s", strerror(errno));
+ goto RECEIVE_THREAD_EXIT;
+ }
while(1) {
char buf[MAXBUF] = {0,};
int arg_len = 0;
int result = MDGD_ERROR_NONE;
int cmd;
- std::string requester_id, group_name, uuid, data, data_length, channel_id, file_path;
+ std::string requester_id, group_name, uuid, data, data_length, channel_id, file_path, conn_type;
#ifdef SUPPORT_BASE64_ENCODING
int data_len;
size_t outSize;
if (!requestRep.getValue("file_path", file_path))
LOG_ERR("CMD not found in representation");
+ if (!requestRep.getValue("conn_type", conn_type))
+ LOG_ERR("conn_type not found in representation");
+
mdgd_receive_file_t *receive_file = g_new0(mdgd_receive_file_t, 1);
receive_file->file_path = g_strdup(file_path.c_str());
receive_file->device_id = g_strdup(requester_id.c_str());
+ receive_file->conn_type = g_strdup(conn_type.c_str());
g_thread_try_new("file_receive_thread",
__file_receive_thread_func, receive_file, NULL);