/* server.c */ #include #include #include #include #include #include #include #define BUF_SIZE 1024 void error_exit (char *msg) { perror (msg); exit (2); } int main(int argc,char *argv[]) { int create_socket; int bufsize = BUF_SIZE; int msglen, n_sent, rcvlen; char *buffer = malloc(BUF_SIZE); struct sockaddr_in address; const struct sockaddr *sendaddr = (struct sockaddr *)&address; struct sockaddr fromaddr; int fromlen; /// check for at least 1 argv: if (argc < 2) { fprintf (stderr, "usage: server ipv4.dotted.quad.address\n"); exit (1); } printf("\x1B[2J"); if ((create_socket = socket(AF_INET, SOCK_DGRAM, 0)) > 0) printf("socket created\n"); else error_exit ("socket error"); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(15000); if (inet_pton (AF_INET,argv[1],&address.sin_addr) < 0) error_exit ("inet_pton error"); if (bind (create_socket, (struct sockaddr *)&address, sizeof(address)) == 0) printf("bind socket succeeded\n"); else error_exit ("bind error"); for (;;) { rcvlen = recvfrom (create_socket, buffer, BUF_SIZE, 0, &fromaddr, &fromlen); if (rcvlen < 0) error_exit ("recvfrom error"); buffer [rcvlen] = '\0'; printf ("Message received: %s\n", buffer); printf ("Message to send: "); ///gets(buffer); fgets (buffer, BUF_SIZE, stdin); if (strncmp (buffer, "/q", 2) == 0) break; // use /q to quit msglen = strlen (buffer); ///n_sent = sendto (create_socket, buffer, msglen, 0, sendaddr, 10 * sizeof (struct in_addr)); n_sent = sendto (create_socket, buffer, msglen, 0, (struct sockaddr *)&fromaddr, fromlen); if (n_sent < 0) error_exit ("sendto error"); if (n_sent != msglen) fprintf (stderr, "sendto: short write (%d / %d)\n", n_sent, msglen); sleep (1); } close (create_socket); }