|
CS473 - Computer Networks
| Displaying exercises/e6/solution/chat.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define K 1024
#define PORT 47350
int main(int argc, char *argv[])
{
char *username = getenv("USER");
struct hostent *he;
struct sockaddr_in server;
fd_set rfds;
char cbuf[K], buf[K];
int sock, r, n;
short port = PORT;
if (argc < 2) {
fprintf(stderr,"Usage: chat <hostname> [<port>]\n");
return 0;
}
if (argc > 2) port = atoi(argv[2]);
if (username == NULL) username = "sbaker";
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
exit(1);
}
server.sin_family = AF_INET;
if ((he = gethostbyname(argv[1])) == NULL) {
fprintf(stderr,"Unknown host: %s\n", argv[1]);
exit(1);
}
memcpy(&server.sin_addr, he->h_addr, he->h_length);
server.sin_port = htons(port);
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("connect");
exit(1);
}
printf("connected.\n");
while(1) {
FD_ZERO(&rfds);
FD_SET(STDIN_FILENO, &rfds);
FD_SET(sock, &rfds);
r = select(sock+1, &rfds, NULL, NULL, NULL);
if (FD_ISSET(STDIN_FILENO, &rfds)) {
if (fgets(cbuf, K, stdin) == NULL) break;
snprintf(buf, K, "%s: %s", username, cbuf);
if (write(sock, buf, strlen(buf)) < 0) break;
}
if (FD_ISSET(sock, &rfds)) {
if ((r = read(sock, buf, K)) < 0) break;
printf("%.*s", r, buf);
}
}
return 0;
}
|