0% found this document useful (0 votes)
201 views5 pages

C Network Programming

This C code implements a basic client-server model for network communication. The server code creates a socket, binds it to a port, and listens for incoming connections. When a client connects, the server forks a child process to handle communication on that socket. The client code obtains the server's address information, connects to it, and then enters a read-write loop to exchange messages with the server before closing the connection.

Uploaded by

Abdul Hafiz
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
Download as docx, pdf, or txt
0% found this document useful (0 votes)
201 views5 pages

C Network Programming

This C code implements a basic client-server model for network communication. The server code creates a socket, binds it to a port, and listens for incoming connections. When a client connects, the server forks a child process to handle communication on that socket. The client code obtains the server's address information, connects to it, and then enters a read-write loop to exchange messages with the server before closing the connection.

Uploaded by

Abdul Hafiz
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1/ 5

streamS #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.

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); }

printf("Server : %s\n", buf); } close(sockfd); return 0; }

You might also like