/* * * Copyright 2019 AT&T Intellectual Property * Copyright 2019 Nokia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include //for close() #include #include #include #include #include //for inet_ntop() #include #include "e2sim_sctp.h" const int CLIENT_SEND_COUNT = 1; const int SERVER_LISTEN_QUEUE_SIZE = 10; int sctp_start_server(const char *server_ip_str, const int server_port) { if(server_port < 1 || server_port > 65535) { fprintf(stderr, "Invalid port number (%d). Valid values are between 1 and 65535.\n", server_port); return -1; } int server_fd; if((server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) == -1) { perror("socket"); return -1; } struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(server_port); server_addr.sin_addr.s_addr = inet_addr(server_ip_str); if(bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); return -1; } if(listen(server_fd, SERVER_LISTEN_QUEUE_SIZE) != 0) { perror("listen"); return -1; } assert(server_fd != 0); fprintf(stderr, "SCTP server started on %s:%d\n", server_ip_str, server_port); return server_fd; } int sctp_start_client(const char *server_ip_str, const int server_port) { int client_fd; if((client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) == -1) { perror("socket"); return -1; } struct sockaddr_in peer_addr; memset(&peer_addr, 0, sizeof(struct sockaddr_in)); peer_addr.sin_family = AF_INET; peer_addr.sin_port = htons(server_port); peer_addr.sin_addr.s_addr = inet_addr(server_ip_str); // if(inet_pton(AF_INET, server_ip, &(peer_addr.sin_addr)) != 1) { // printf("Error converting IP address (%s) to sockaddr_in structure\n", server_ip); // return 0; // } fprintf(stderr, "Connecting to server at %s:%d ...", server_ip_str, server_port); if(connect(client_fd, (struct sockaddr*)&peer_addr, sizeof(peer_addr)) == -1) { perror("connect"); return -1; } assert(client_fd != 0); fprintf(stderr, "OK\n"); return client_fd; } //ssize_t sctp_send_to_socket(int sockfd, const void* buf, size_t len) int sctp_send_to_socket(int sockfd, const void* buf, size_t len) { int sent_len = 0; sent_len = send(sockfd, buf, len, 0); if(sent_len == -1) { perror("sctp_send_to_socket"); return -1; } return sent_len; } // int sctp_recv_from_socket(int sockfd, void *buf, size_t buf_size) // { // //int len = 0; // // memset(buf, 0, buf_size); // // int len = recv(sockfd, &buf, buf_size, 0); // if(len == -1) // { // perror("sctp_recv_from_socket"); // return -1; // } // // return len; // } //test only void client_send_multiple_test_msg(int client_fd) { char buf[1024]; int SEND_COUNT = 4; for(int i = 0; i < SEND_COUNT; i++) { fprintf(stderr, "Sending message %d of %d \n", i+1, SEND_COUNT); memset(buf, 0, sizeof(buf)); snprintf(buf, sizeof(buf)-1, "DATA %d", i+1); if(send(client_fd, &buf, strlen(buf), 0) == -1) { perror("send"); return; } memset(buf, 0, sizeof(buf)); if(recv(client_fd, &buf, sizeof(buf), 0) == -1) { perror("recv"); return; } fprintf(stderr, "Server reply: %s\n", buf); sleep(1); } fprintf(stderr, "Closing...\n"); if(close(client_fd) == -1) { perror("close"); return; } }