Created
June 6, 2021 15:49
-
-
Save roshanadh/deee13b17262a64a40fd0d733fc8ec17 to your computer and use it in GitHub Desktop.
getpeername() and getsockname() example server in C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <arpa/inet.h> | |
#include <netinet/in.h> | |
#include <sys/socket.h> | |
#include <sys/types.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
void handle_client(int); | |
#define BACKLOG 10 | |
#define PORT 5678 | |
int main() { | |
// ! socket | |
int server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (server_fd == -1) { | |
perror("socket()"); | |
exit(EXIT_FAILURE); | |
} | |
// ! bind | |
struct sockaddr_in sa; | |
memset(&sa, 0, sizeof sa); | |
sa.sin_family = AF_INET; | |
sa.sin_port = htons(PORT); | |
sa.sin_addr.s_addr = htonl(INADDR_ANY); | |
int retval = bind(server_fd, (struct sockaddr *) &sa, sizeof sa); | |
if (retval == -1) { | |
perror("bind()"); | |
close(server_fd); | |
exit(EXIT_FAILURE); | |
} | |
// ! listen | |
retval = listen(server_fd, BACKLOG); | |
if (retval == -1) { | |
perror("listen()"); | |
close(server_fd); | |
exit(EXIT_FAILURE); | |
} | |
for (;;) { | |
// ! accept | |
int client_fd = accept(server_fd, NULL, NULL); | |
if (client_fd == -1) { | |
perror("accept()"); | |
close(server_fd); | |
exit(EXIT_FAILURE); | |
} | |
// * getpeername | |
struct sockaddr_in peeraddr; | |
socklen_t peeraddrlen; | |
retval = getpeername(client_fd, (struct sockaddr *) &peeraddr, &peeraddrlen); | |
if (retval == -1) { | |
perror("getpeername()"); | |
close(server_fd); | |
close(client_fd); | |
exit(EXIT_FAILURE); | |
} | |
char *peeraddrpresn = inet_ntoa(peeraddr.sin_addr); | |
printf("Peer information:\n"); | |
printf("Peer Address Family: %d\n", peeraddr.sin_family); | |
printf("Peer Port: %d\n", ntohs(peeraddr.sin_port)); | |
printf("Peer IP Address: %s\n\n", peeraddrpresn); | |
// * getsockname | |
struct sockaddr_in localaddr; | |
socklen_t localaddrlen; | |
retval = getpeername(client_fd, (struct sockaddr *) &localaddr, &localaddrlen); | |
if (retval == -1) { | |
perror("getsockname()"); | |
close(server_fd); | |
close(client_fd); | |
exit(EXIT_FAILURE); | |
} | |
char *localaddrpresn = inet_ntoa(localaddr.sin_addr); | |
printf("Socket information:\n"); | |
printf("Local Address Family: %d\n", localaddr.sin_family); | |
printf("Local Port: %d\n", ntohs(localaddr.sin_port)); | |
printf("Local IP Address: %s\n\n", localaddrpresn); | |
handle_client(client_fd); | |
close(client_fd); | |
} | |
} | |
void handle_client(int client_fd) { | |
int size = 100; | |
char buffer[size]; | |
// ! read | |
int readlen = read(client_fd, buffer, size); | |
if (readlen == -1) { | |
perror("read()"); | |
close(client_fd); | |
exit(EXIT_FAILURE); | |
} | |
printf("%d bytes read from client: %s\n", readlen, buffer); | |
// ! write | |
int writelen = write(client_fd, buffer, readlen); | |
if (writelen == -1) { | |
perror("write()"); | |
close(client_fd); | |
exit(EXIT_FAILURE); | |
} | |
printf("%d bytes written to client: %s\n", writelen, buffer); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment