using namespace std; #include <iostream> #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <stdlib.h> #include <stdio.h> #define MAXLEN 1024 void error(const char *); void TCP(const char* PORT, const char* HOST); void UDP(int PORT, const char* HOST); int main(int argc, char *argv[]) { printf("argv[0]: %s\n" , argv[0] ); printf("argv[1]: %s\n" , argv[1] ); if (strcmp(argv[1],"TCP") == 0){ TCP("9999", argv[2]); }else if (strcmp(argv[1],"UDP") == 0){ UDP(9998 ,argv[2]); }else{ printf("ERROR: first argument must be TCP or UDP.\n"); return -1; } } void error(const char *msg) { perror(msg); exit(0); } void TCP(const char* PORT, const char* HOST){ int client_socket = socket(AF_INET, SOCK_STREAM, 0); //obtenemos la direccion con getaddrinfo struct addrinfo hints, *res; memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; getaddrinfo(HOST, PORT, &hints, &res); //primitiva CONNECT connect(client_socket, res->ai_addr, res->ai_addrlen); //primitiva SEND char *msg = "TCP"; int msg_size = strlen(msg); int sent_msg_size = send(client_socket, msg, msg_size, 0); printf("intentando conexion con localhost:9999\n"); char* data = (char*)malloc(MAXLEN); int data_size = MAXLEN; while (true){ int received_data_size = recv(client_socket, data, data_size, 0); printf("%s\n", data); free (data); data = (char*)malloc(MAXLEN); data_size = MAXLEN; sleep(1); } close(client_socket); freeaddrinfo(res); } void UDP(int PORT, const char* HOST){ int sock, n; unsigned int length; struct sockaddr_in server, from; struct hostent *hp; char buffer[256]; sock= socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) error("socket"); server.sin_family = AF_INET; hp = gethostbyname(HOST); if (hp==0) error("Unknown host"); bcopy((char *)hp->h_addr, (char *)&server.sin_addr, hp->h_length); server.sin_port = htons(PORT); length=sizeof(struct sockaddr_in); bzero(buffer,256); sprintf(buffer, "subscription"); if (sendto(sock,buffer, strlen(buffer),0,(const struct sockaddr *)&server,length) < 0) error("Error on send first datagram"); n = recvfrom(sock,buffer,256,0,(struct sockaddr *)&from, &length); if (n < 0) error("recvfrom"); write(1,"Got an ack: ",12); write(1,buffer,n); close(sock); }