Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <string.h>
- #include "../debug/debug.h"
- #include "../cmdline/server_cmdline.h"
- #define PORT_LIMIT 1 << 16
- int setup_tcp_server(uint16_t port);
- int main(int argc, char *argv[])
- {
- struct gengetopt_args_info args;
- // cmdline_parser: deve ser a primeira linha de código no main
- if( cmdline_parser(argc, argv, &args) )
- ERROR(99, "Erro: execução de cmdline_parser\n");
- int port = args.porto_arg;
- if (port <= 0 || port >= PORT_LIMIT) {
- fprintf(stderr, "Invalid port (%d)\n", port);
- return 44;
- }
- int tcp_server_socket = setup_tcp_server(port);
- // TCP IPv4: "accept" 1 cliente (bloqueante)
- char tcp_client_string_ip[20];
- struct sockaddr_in tcp_client_endpoint;
- socklen_t tcp_client_endpoint_length = sizeof(struct sockaddr_in);
- int tcp_client_socket;
- while(1){
- printf("à espera da ligação do cliente... "); fflush(stdout);
- if ((tcp_client_socket = accept(
- tcp_server_socket,
- (struct sockaddr *) &tcp_client_endpoint,
- &tcp_client_endpoint_length)) == -1){
- ERROR(54, "Can't accept client");
- }
- printf("ok. \n");
- printf("cliente: %s@%d\n",
- inet_ntop(
- AF_INET,
- &tcp_client_endpoint.sin_addr,
- tcp_client_string_ip,
- sizeof(tcp_client_string_ip)),
- htons(tcp_client_endpoint.sin_port));
- // TCP IPv4: variáveis auxiliares para send() / recv()
- ssize_t tcp_read_bytes, tcp_sent_bytes;
- char buffer[100];
- // TCP IPv4: "recv" do cliente (bloqueante)
- printf("à espera de dados do cliente... "); fflush(stdout);
- if ((tcp_read_bytes = recv(
- tcp_client_socket,
- buffer,
- sizeof(buffer) - 1,
- 0)) == -1)
- ERROR(57, "Can't recv from client");
- printf("ok. (%d bytes sent)\n", (int)tcp_read_bytes);
- buffer[tcp_read_bytes] = '\0';
- if (tcp_read_bytes == 0) {
- fprintf(stderr, "Client closed connection!\n");
- if (close(tcp_client_socket) == -1){
- ERROR(55, "Can't close tcp_client_socket (IPv4)");
- }
- continue;
- }
- printf("Number String: %s\n", buffer);
- uint32_t number = atoi(buffer);
- number = htonl(number);
- // TCP IPv4: "send" para o cliente
- printf("a enviar dados para o cliente... "); fflush(stdout);
- if ((tcp_sent_bytes = send(
- tcp_client_socket,
- &number,
- sizeof(number),
- 0)) == -1)
- ERROR(58, "Can't send to client");
- printf("ok. (%d bytes received)\n", (int)tcp_sent_bytes);
- // TCP IPv4: fecha socket (client)
- if (close(tcp_client_socket) == -1){
- ERROR(55, "Can't close tcp_client_socket (IPv4)");
- }
- }
- // TCP IPv4: fecha socket (server)
- if (close(tcp_server_socket) == -1)
- ERROR(56, "Can't close tcp_server_socket (IPv4)");
- printf("ligação fechada. ok. \n");
- // libertar recurso (cmdline_parser)
- cmdline_parser_free(&args);
- exit(0);
- }
- int setup_tcp_server(uint16_t port){
- // TCP IPv4: cria socket
- int tcp_server_socket;
- if ((tcp_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- ERROR(51, "Can't create tcp_server_socket (IPv4)");
- // TCP IPv4: bind a IPv4/porto
- struct sockaddr_in tcp_server_endpoint;
- memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));
- tcp_server_endpoint.sin_family = AF_INET;
- tcp_server_endpoint.sin_addr.s_addr = htonl(INADDR_ANY); // Todas as interfaces de rede
- tcp_server_endpoint.sin_port = htons(port); // Server port
- if (bind(tcp_server_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
- ERROR(52, "Can't bind @tcp_server_endpoint");
- // TCP IPv4: "listen" por clientes
- int tcp_max_simultaneous_clients = 1;
- if (listen(tcp_server_socket, tcp_max_simultaneous_clients) == -1)
- ERROR(53, "Can't listen for %d clients", tcp_max_simultaneous_clients);
- return tcp_server_socket;
- }
- //LAB4
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <string.h>
- #include "../debug/debug.h"
- #include "../cmdline/server_cmdline.h"
- #define PORT_LIMIT 1 << 16
- int setup_tcp_server(uint16_t port);
- int read_string_from_socket(
- int tcp_client_socket,
- char *buffer,
- size_t buffer_size);
- int main(int argc, char *argv[])
- {
- struct gengetopt_args_info args;
- // cmdline_parser: deve ser a primeira linha de código no main
- if( cmdline_parser(argc, argv, &args) )
- ERROR(99, "Erro: execução de cmdline_parser\n");
- int port = args.porto_arg;
- if (port <= 0 || port >= PORT_LIMIT) {
- fprintf(stderr, "Invalid port (%d)\n", port);
- return 44;
- }
- int tcp_server_socket = setup_tcp_server(port);
- // TCP IPv4: "accept" 1 cliente (bloqueante)
- char tcp_client_string_ip[20];
- struct sockaddr_in tcp_client_endpoint;
- socklen_t tcp_client_endpoint_length = sizeof(struct sockaddr_in);
- int tcp_client_socket;
- while(1){
- printf("à espera da ligação do cliente... "); fflush(stdout);
- if ((tcp_client_socket = accept(
- tcp_server_socket,
- (struct sockaddr *) &tcp_client_endpoint,
- &tcp_client_endpoint_length)) == -1){
- ERROR(54, "Can't accept client");
- }
- printf("ok. \n");
- printf("cliente: %s@%d\n",
- inet_ntop(
- AF_INET,
- &tcp_client_endpoint.sin_addr,
- tcp_client_string_ip,
- sizeof(tcp_client_string_ip)),
- htons(tcp_client_endpoint.sin_port));
- sleep(2);
- // TCP IPv4: variáveis auxiliares para send() / recv()
- char buffer[100];
- int read_result = read_string_from_socket(
- tcp_client_socket,
- buffer,
- sizeof(buffer));
- if (read_result != 0) {
- fprintf(stderr, "Client closed connection!\n");
- if (close(tcp_client_socket) == -1){
- ERROR(55, "Can't close tcp_client_socket (IPv4)");
- }
- continue;
- }
- printf("String: %s\n", buffer);
- read_result = read_string_from_socket(
- tcp_client_socket,
- buffer,
- sizeof(buffer));
- if (read_result != 0) {
- fprintf(stderr, "Client closed connection!\n");
- if (close(tcp_client_socket) == -1){
- ERROR(55, "Can't close tcp_client_socket (IPv4)");
- }
- continue;
- }
- printf("String: %s\n", buffer);
- // TCP IPv4: fecha socket (client)
- if (close(tcp_client_socket) == -1){
- ERROR(55, "Can't close tcp_client_socket (IPv4)");
- }
- }
- // TCP IPv4: fecha socket (server)
- if (close(tcp_server_socket) == -1)
- ERROR(56, "Can't close tcp_server_socket (IPv4)");
- printf("ligação fechada. ok. \n");
- // libertar recurso (cmdline_parser)
- cmdline_parser_free(&args);
- exit(0);
- }
- int read_string_from_socket(
- int tcp_client_socket,
- char *buffer,
- size_t buffer_size){
- ssize_t tcp_read_bytes;
- // TCP IPv4: "recv" do cliente (bloqueante)
- printf("à espera de dados do cliente... "); fflush(stdout);
- if ((tcp_read_bytes = recv(
- tcp_client_socket,
- buffer,
- buffer_size - 1,
- 0)) == -1)
- ERROR(57, "Can't recv from client");
- printf("ok. (%d bytes sent)\n", (int)tcp_read_bytes);
- buffer[tcp_read_bytes] = '\0';
- return tcp_read_bytes > 0 ? 0 : -1;
- }
- int setup_tcp_server(uint16_t port){
- // TCP IPv4: cria socket
- int tcp_server_socket;
- if ((tcp_server_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- ERROR(51, "Can't create tcp_server_socket (IPv4)");
- // TCP IPv4: bind a IPv4/porto
- struct sockaddr_in tcp_server_endpoint;
- memset(&tcp_server_endpoint, 0, sizeof(struct sockaddr_in));
- tcp_server_endpoint.sin_family = AF_INET;
- tcp_server_endpoint.sin_addr.s_addr = htonl(INADDR_ANY); // Todas as interfaces de rede
- tcp_server_endpoint.sin_port = htons(port); // Server port
- if (bind(tcp_server_socket, (struct sockaddr *) &tcp_server_endpoint, sizeof(struct sockaddr_in)) == -1)
- ERROR(52, "Can't bind @tcp_server_endpoint");
- // TCP IPv4: "listen" por clientes
- int tcp_max_simultaneous_clients = 1;
- if (listen(tcp_server_socket, tcp_max_simultaneous_clients) == -1)
- ERROR(53, "Can't listen for %d clients", tcp_max_simultaneous_clients);
- return tcp_server_socket;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement