Skip to content

Instantly share code, notes, and snippets.

@roshanadh
Created June 6, 2021 15:49
Show Gist options
  • Save roshanadh/deee13b17262a64a40fd0d733fc8ec17 to your computer and use it in GitHub Desktop.
Save roshanadh/deee13b17262a64a40fd0d733fc8ec17 to your computer and use it in GitHub Desktop.
getpeername() and getsockname() example server in C
#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