Last active
December 18, 2021 22:23
-
-
Save menangen/9271d213ebbe7e7a2392b5e65b17d735 to your computer and use it in GitHub Desktop.
UNIX C TCP socket: server and client
This file contains hidden or 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 <netdb.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/socket.h> | |
#include <unistd.h> | |
#include <arpa/inet.h> | |
#define MAX 80 | |
#define PORT 8080 | |
#define SA struct sockaddr | |
void func(int sockfd) | |
{ | |
char buff[MAX]; | |
int n; | |
for (;;) { | |
bzero(buff, sizeof(buff)); | |
printf("Enter the string : "); | |
n = 0; | |
while ((buff[n++] = getchar()) != '\n') | |
; | |
write(sockfd, buff, sizeof(buff)); | |
bzero(buff, sizeof(buff)); | |
read(sockfd, buff, sizeof(buff)); | |
printf("From Server : %s", buff); | |
if ((strncmp(buff, "exit", 4)) == 0) { | |
printf("Client Exit...\n"); | |
break; | |
} | |
} | |
} | |
int main() | |
{ | |
int sockfd, connfd; | |
struct sockaddr_in servaddr, cli; | |
// socket create and varification | |
sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
if (sockfd == -1) { | |
printf("socket creation failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Socket successfully created..\n"); | |
bzero(&servaddr, sizeof(servaddr)); | |
// assign IP, PORT | |
servaddr.sin_family = AF_INET; | |
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); | |
servaddr.sin_port = htons(PORT); | |
// connect the client socket to server socket | |
if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) != 0) { | |
printf("connection with the server failed...\n"); | |
exit(0); | |
} | |
else | |
printf("connected to the server..\n"); | |
// function for chat | |
func(sockfd); | |
// close the socket | |
close(sockfd); | |
} |
This file contains hidden or 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 <netdb.h> | |
#include <netinet/in.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <unistd.h> | |
#define MAX 255 | |
#define PORT 8080 | |
typedef struct sockaddr_in socketAddress; | |
typedef struct sockaddr* socketInfo; | |
typedef socklen_t socketSize; | |
#define ACCEPT(s, client) accept(s, (socketInfo)&client, &client_size) | |
#define SERVER_BIND(s, server) bind (s, (socketInfo)&server, server_size) | |
#define SRV_FAMILY(server, to) (server.sin_family = to) | |
#define SRV_ADDRESS(server, type) (server.sin_addr.s_addr = htonl(type)) | |
#define SRV_PORT(server, number) (server.sin_port = htons(number)) | |
#define NET AF_INET | |
#define ANY INADDR_ANY | |
#define TCP SOCK_STREAM | |
void Read(int connection) | |
{ | |
char buff[MAX] = ""; | |
// read the message from client and copy it in buffer | |
read(connection, buff, sizeof(buff)); | |
// print buffer which contains the client contents | |
printf("From client:\n\n"); | |
printf("%s", buff); | |
} | |
void Write(int connection) | |
{ | |
char response_HEAD[] = "HTTP/1.1 200 OK"; | |
int header_bytes = sizeof(response_HEAD) - 1; | |
char response_BREAK[] = "\n\n"; | |
int break_bytes = sizeof(response_BREAK) - 1; | |
char response_BODY[] = "<html><body><h1>Hi Menangen</h1></body></html>"; | |
int body_bytes = sizeof(response_BODY) - 1; | |
// and send response[] to client without "\0" string | |
write(connection, response_HEAD, header_bytes); | |
write(connection, response_BREAK, break_bytes); | |
write(connection, response_BODY, body_bytes); | |
printf("\n\n"); | |
printf( "sent %i bytes:\n_________________\n", | |
header_bytes + break_bytes + body_bytes ); | |
puts(response_HEAD); | |
printf("%s", response_BREAK); | |
puts(response_BODY); | |
puts("_________________"); | |
} | |
// Driver function | |
int main() | |
{ | |
int sock_descriptor, connection; | |
socketAddress server, client; | |
socketSize client_size = sizeof(client); | |
socketSize server_size = sizeof(server); | |
// socket create and verification | |
sock_descriptor = socket(NET, TCP, 0); | |
if (sock_descriptor == -1) { | |
printf("socket creation failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Socket successfully created..\n"); | |
bzero(&server, server_size); | |
// assign IP, PORT | |
SRV_FAMILY (server, NET); | |
SRV_ADDRESS(server, ANY); | |
SRV_PORT (server, PORT); | |
// Binding newly created socket to given IP and verification | |
if (SERVER_BIND(sock_descriptor, server) != 0) { | |
printf("socket bind failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Socket successfully binded..\n"); | |
// Now server is ready to listen and verification | |
if (listen(sock_descriptor, 5) != 0) { | |
printf("Listen failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Server listening..\n"); | |
// Accept the data packet from client and verification | |
connection = ACCEPT(sock_descriptor, client); | |
if (connection < 0) { | |
printf("server accept failed...\n"); | |
exit(0); | |
} | |
else | |
printf("server accept the client...\n"); | |
// Function for communication between client and server | |
Read(connection); | |
Write(connection); | |
// After close the socket | |
close(sock_descriptor); | |
} |
This file contains hidden or 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 <netdb.h> | |
#include <netinet/in.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <unistd.h> | |
#define MAX 80 | |
#define PORT 8080 | |
#define SA struct sockaddr | |
// Function designed for chat between client and server. | |
void func(int sockfd) | |
{ | |
char buff[MAX]; | |
int n; | |
// infinite loop for chat | |
for (;;) { | |
bzero(buff, MAX); | |
// read the message from client and copy it in buffer | |
read(sockfd, buff, sizeof(buff)); | |
// print buffer which contains the client contents | |
printf("From client: %s\t To client : ", buff); | |
bzero(buff, MAX); | |
n = 0; | |
// copy server message in the buffer | |
while ((buff[n++] = getchar()) != '\n'); | |
// and send that buffer to client | |
write(sockfd, buff, sizeof(buff)); | |
// if msg contains "Exit" then server exit and chat ended. | |
if (strncmp("exit", buff, 4) == 0) { | |
printf("Server Exit...\n"); | |
break; | |
} | |
} | |
} | |
// Driver function | |
int main() | |
{ | |
int sockfd, connfd; | |
struct sockaddr_in servaddr, cli; | |
// socket create and verification | |
sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
if (sockfd == -1) { | |
printf("socket creation failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Socket successfully created..\n"); | |
bzero(&servaddr, sizeof(servaddr)); | |
// assign IP, PORT | |
servaddr.sin_family = AF_INET; | |
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); | |
servaddr.sin_port = htons(PORT); | |
// Binding newly created socket to given IP and verification | |
if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { | |
printf("socket bind failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Socket successfully binded..\n"); | |
// Now server is ready to listen and verification | |
if ((listen(sockfd, 5)) != 0) { | |
printf("Listen failed...\n"); | |
exit(0); | |
} | |
else | |
printf("Server listening..\n"); | |
socklen_t len = sizeof(cli); | |
// Accept the data packet from client and verification | |
connfd = accept(sockfd, (SA*)&cli, &len); | |
if (connfd < 0) { | |
printf("server accept failed...\n"); | |
exit(0); | |
} | |
else | |
printf("server accept the client...\n"); | |
// Function for chatting between client and server | |
func(connfd); | |
// After chatting close the socket | |
close(sockfd); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment