C Network Programming
C Network Programming
h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/wait.h> #include <signal.h> #define PORT "3490" #define BACKLOG 10 #define MAXDATASIZE 100 void sigchld_handler(int s) { while(waitpid(-1, NULL, WNOHANG) > 0); } void *get_in_addr(struct sockaddr* sa) { if(sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } int main(void) { int sockfd, new_fd; struct addrinfo hints, *servinfo, *p; struct sockaddr_storage their_addr; socklen_t sin_size; struct sigaction sa; int yes=1; char s[INET6_ADDRSTRLEN]; int rv, n; char str[100]; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); return 1; } for(p = servinfo; p != NULL; p = p->ai_next) { if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("Server: Socket"); continue; }
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) { perror("Setsockopt"); exit(1); } if(bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("Server: bind"); continue; } break; } if(p == NULL) { fprintf(stderr, "Server: Failed to bind\n"); return 2; } freeaddrinfo(servinfo); if(listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } sa.sa_handler = sigchld_handler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; if(sigaction(SIGCHLD, &sa, NULL) == -1) { perror("sigaction"); exit(1); } printf("Server: Waiting for connection ... \n"); while(1) { sin_size = sizeof their_addr; new_fd = accept(sockfd, (struct sockaddr*)&their_addr, &sin_size); if(new_fd == -1) { perror("accept"); continue; } inet_ntop(their_addr.ss_family, get_in_addr((struct sockaddr*)&their_addr), s, sizeof s); printf("Server: Got connection from %s\n", s);
if(!fork()) { close(sockfd); if(n = recv(new_fd, str, MAXDATASIZE -1, 0) == -1) { perror("recv"); close(new_fd); exit(0); } if(send(new_fd, str, n, 0) == -1) perror("send"); close(new_fd); exit(0); } close(new_fd); } return 0; } streamC #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT "3490" #define MAXDATASIZE 100 void *get_in_addr(struct sockaddr* sa) { if(sa->sa_family == AF_INET) { return &(((struct sockaddr_in*)sa)->sin_addr); } return &(((struct sockaddr_in6*)sa)->sin6_addr); } int main(int argc, char *argv[]) { int sockfd, new_fd, numbytes; char buf[MAXDATASIZE]; struct addrinfo hints, *servinfo, *p; int rv; char s[INET6_ADDRSTRLEN]; /*if(argc != 2) { fprintf(stderr, "Usage: Client hostname\n"); exit(1); }*/ memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM;
if((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { fprintf(stderr, "Getaddrinfo: %s\n", gai_strerror(rv)); return 1; } for(p = servinfo; p != NULL; p = p->ai_next) { if((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror("Client: Socket"); continue; } if(connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { close(sockfd); perror("Client: Connect"); continue; } break; } if(p == NULL) { fprintf(stderr, "Client: Failed to connect\n"); return 2; }
inet_ntop(p->ai_family, get_in_addr((struct sockaddr*)p->ai_addr), s, sizeof s); printf("================================\n", s); printf("Client: Connecting to %s\n", s); freeaddrinfo(servinfo); while(1) { /*if(argc != 2) { fprintf(stderr, "Usage: Client hostname\n", buf); exit(1); }*/ printf("Client : "); fgets(buf, MAXDATASIZE, stdin); !feof(stdin); //scanf("%s", buf, MAXDATASIZE, stdin); if((send(sockfd, buf, strlen(buf), 0)) == -1) { perror("send"); exit(1); } if((numbytes = recv(sockfd, buf, strlen(buf), 0)) == -1) { buf[numbytes] = '\0'; perror("recv"); exit(1); }