From 1ebfafa0d16739f63f1f6effbb3bdfd644c3de7a Mon Sep 17 00:00:00 2001 From: Dane MacFadden Date: Fri, 20 Jun 2025 22:51:25 -0600 Subject: [PATCH] added logic to determine who's client and who's server --- main.c | 127 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 59 deletions(-) diff --git a/main.c b/main.c index e52ee02..5cce76f 100644 --- a/main.c +++ b/main.c @@ -20,7 +20,7 @@ #define MAXBUFSIZE 30 -int socketfd, socketfd_send; +int socketfd; struct addrinfo hints, remote_hints; struct addrinfo *servinfo, *remote_servinfo; @@ -56,72 +56,81 @@ int main(int argc, char* argv[]) { remote_machine = argv[2]; remote_port = argv[3]; - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_INET; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_PASSIVE; + if (atoi(local_port) < atoi(remote_port)) { + /* Congrats, you're the server */ + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; - if ((status = getaddrinfo(remote_machine, local_port, &hints, &servinfo)) != 0) { - fprintf(stderr,"getaddrinfo error: %s\n",gai_strerror(status)); - exit(1); - } - - /* Create socket */ - for (p = servinfo; p != NULL; p = p->ai_next) { - if ((socketfd = socket(p->ai_family, - p->ai_socktype, - p->ai_protocol)) == -1) { - perror("listener: socket"); - continue; + if ((status = getaddrinfo(NULL, local_port, &hints, &servinfo)) != 0) { + fprintf(stderr,"getaddrinfo error: %s\n",gai_strerror(status)); + exit(1); } - - /* Bind */ - if (bind(socketfd, servinfo->ai_addr, servinfo->ai_addrlen) == -1) { - close(socketfd); - perror("listener: bind"); - continue; - } - - break; - } - if (p == NULL) { - fprintf(stderr, "listener: failed to bind socket\n"); - return 2; - } - else { - servinfo = p; - } - - /* Get remote info */ - memset(&remote_hints, 0, sizeof(remote_hints)); - remote_hints.ai_family = AF_INET; - remote_hints.ai_socktype = SOCK_STREAM; - - if ((status = getaddrinfo(remote_machine, remote_port, &remote_hints, - &remote_servinfo)) != 0) { - fprintf(stderr,"getaddrinfo error: %s\n",gai_strerror(status)); - exit(1); - } - for (q = remote_servinfo; q != NULL; q = q->ai_next) { + /* Create socket */ - if ((socketfd_send = socket(q->ai_family, - q->ai_socktype, - q->ai_protocol)) == -1) { - perror("talker: socket"); - continue; + for (p = servinfo; p != NULL; p = p->ai_next) { + if ((socketfd = socket(p->ai_family, + p->ai_socktype, + p->ai_protocol)) == -1) { + perror("listener: socket"); + continue; + } + + /* Bind */ + if (bind(socketfd, servinfo->ai_addr, servinfo->ai_addrlen) == -1) { + close(socketfd); + perror("listener: bind"); + continue; + } + + break; + } + if (p == NULL) { + fprintf(stderr, "listener: failed to bind socket\n"); + return 2; + } + else { + servinfo = p; } - - break; - } - - if (q == NULL) { - fprintf(stderr, "talker: failed to create socket\n"); - return 2; } else { - remote_servinfo = q; + /* You're the client */ + /* Get remote info */ + memset(&remote_hints, 0, sizeof(remote_hints)); + remote_hints.ai_family = AF_INET; + remote_hints.ai_socktype = SOCK_STREAM; + + if ((status = getaddrinfo(remote_machine, remote_port, &remote_hints, + &remote_servinfo)) != 0) { + fprintf(stderr,"getaddrinfo error: %s\n",gai_strerror(status)); + exit(1); + } + for (q = remote_servinfo; q != NULL; q = q->ai_next) { + /* Create socket */ + if ((socketfd = socket(q->ai_family, + q->ai_socktype, + q->ai_protocol)) == -1) { + perror("talker: socket"); + continue; + } + + break; + } + + if (q == NULL) { + fprintf(stderr, "talker: failed to create socket\n"); + return 2; + } + else { + remote_servinfo = q; + } } + + + + pthread_create(&input_thread, NULL, input, (void*) msg);