/* Socket Server: Compilation: gcc server.c -o server to run: server [local_port] [remote_host] [remote_port] **** PS: The clients must be running before executing the server ***** */ #include #include #include #include #include #include #include #include #define SIZE 1000 // vector size //############################################################################################ int main(int argc, char* argv[]) { int S0, S1, loc_port, // local port rem_port, // remote port dsr, // descriptor of remote socket vector[SIZE], *v; char *host; struct sockaddr_in rem_addr; // internet address struct sockaddr_in loc_addr; // internet address struct hostent *phost; // pointer to host entry structure if(argc < 3){ printf("Erro uso correto:\n"); printf(" %s \n\n", argv[0]); exit(1); } //clean structure memset ((char *)&rem_addr,0,sizeof(rem_addr)); //Remote Socket host = argv[2]; //Remote machine host phost = gethostbyname(host); //fill out the socket's address information rem_port = atoi(argv[3]); rem_addr.sin_family = AF_INET; // address family rem_addr.sin_port = htons(rem_port); dsr = socket (AF_INET, SOCK_STREAM, 0); //vector to receive v = ( int * ) malloc (sizeof ( int ) * SIZE); //copy ip address into ip address structure memcpy(&rem_addr.sin_addr, phost->h_addr, phost->h_length); if (dsr < 0) { perror("Creating remote stream socket\n"); exit(1); } printf("Conecting on client '%s, port: %d'\n", host, rem_port); // make the connection if (connect(dsr, (struct sockaddr*) &rem_addr, sizeof(rem_addr)) < 0) { perror("Conecting stream socket\n"); exit(1); } // Local Socket //fill out the socket's address information loc_port = atoi(argv[1]); loc_addr.sin_family = AF_INET; loc_addr.sin_addr.s_addr = htonl(INADDR_ANY); loc_addr.sin_port = htons(loc_port); // create the socket S0 = socket(AF_INET, SOCK_STREAM, 0); if (S0 < 0) { perror("Creating local stream socket"); exit(1); } //bind the socket into its address if (bind(S0, (struct sockaddr*) &loc_addr, sizeof(loc_addr)) < 0) { perror("Binding stream socket"); exit(1); } //listen for connections listen(S0, 1); printf("Waiting for conection....\n"); // accept a connection S1 = accept(S0, (struct sockaddr*) 0, (int*) 0); printf("Conection established !!!\n"); //-------------------------------------------------------------------------------------------- // send and receive messages form clients send(dsr, vector, SIZE, 0); recv(S1, v, SIZE, 0); printf("Message backing to the server...\n"); //-------------------------------------------------------------------------------------------- //close the connection close(dsr); close(S0); close(S1); } //############################################################################################