Created
March 31, 2020 06:41
-
-
Save joshcarp/677e224f64fd2b8ed24a309715208d1a to your computer and use it in GitHub Desktop.
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
/* A simple client program for server.c | |
To compile: gcc client.c -o client | |
To run: start the server, then the client */ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <strings.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
#include <unistd.h> | |
int main(int argc, char ** argv) | |
{ | |
int sockfd, portno, n; | |
struct sockaddr_in serv_addr; | |
struct hostent * server; | |
char buffer[256]; | |
if (argc < 3) | |
{ | |
fprintf(stderr, "usage %s hostname port\n", argv[0]); | |
exit(0); | |
} | |
portno = atoi(argv[2]); | |
/* Translate host name into peer's IP address ; | |
* This is name translation service by the operating system | |
*/ | |
server = gethostbyname(argv[1]); | |
if (server == NULL) | |
{ | |
fprintf(stderr, "ERROR, no such host\n"); | |
exit(0); | |
} | |
/* Building data structures for socket */ | |
bzero((char *)&serv_addr, sizeof(serv_addr)); | |
serv_addr.sin_family = AF_INET; | |
bcopy(server->h_addr_list[0], (char *)&serv_addr.sin_addr.s_addr, server->h_length); | |
serv_addr.sin_port = htons(portno); | |
/* Create TCP socket -- active open | |
* Preliminary steps: Setup: creation of active open socket | |
*/ | |
sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
if (sockfd < 0) | |
{ | |
perror("ERROR opening socket"); | |
exit(0); | |
} | |
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) | |
{ | |
perror("ERROR connecting"); | |
exit(0); | |
} | |
/* Do processing | |
*/ | |
printf("Please enter the message: "); | |
bzero(buffer, 256); | |
fgets(buffer, 255, stdin); | |
n = write(sockfd, buffer, strlen(buffer)); | |
if (n < 0) | |
{ | |
perror("ERROR writing to socket"); | |
exit(0); | |
} | |
bzero(buffer, 256); | |
n = read(sockfd, buffer, 255); | |
if (n < 0) | |
{ | |
perror("ERROR reading from socket"); | |
exit(0); | |
} | |
printf("%s\n", buffer); | |
return 0; | |
} |
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
/* A simple server in the internet domain using TCP | |
The port number is passed as an argument | |
To compile: gcc server.c -o server | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <strings.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <unistd.h> | |
int main(int argc, char **argv) | |
{ | |
int sockfd, newsockfd, portno;// clilen; | |
char buffer[256]; | |
struct sockaddr_in serv_addr, cli_addr; | |
socklen_t clilen; | |
int n; | |
if (argc < 2) | |
{ | |
fprintf(stderr,"ERROR, no port provided\n"); | |
exit(1); | |
} | |
/* Create TCP socket */ | |
sockfd = socket(AF_INET, SOCK_STREAM, 0); | |
if (sockfd < 0) | |
{ | |
perror("ERROR opening socket"); | |
exit(1); | |
} | |
bzero((char *) &serv_addr, sizeof(serv_addr)); | |
portno = atoi(argv[1]); | |
/* Create address we're going to listen on (given port number) | |
- converted to network byte order & any IP address for | |
this machine */ | |
serv_addr.sin_family = AF_INET; | |
serv_addr.sin_addr.s_addr = INADDR_ANY; | |
serv_addr.sin_port = htons(portno); // store in machine-neutral format | |
/* Bind address to the socket */ | |
if (bind(sockfd, (struct sockaddr *) &serv_addr, | |
sizeof(serv_addr)) < 0) | |
{ | |
perror("ERROR on binding"); | |
exit(1); | |
} | |
/* Listen on socket - means we're ready to accept connections - | |
incoming connection requests will be queued */ | |
listen(sockfd,5); | |
clilen = sizeof(cli_addr); | |
/* Accept a connection - block until a connection is ready to | |
be accepted. Get back a new file descriptor to communicate on. */ | |
newsockfd = accept( sockfd, (struct sockaddr *) &cli_addr, | |
&clilen); | |
if (newsockfd < 0) | |
{ | |
perror("ERROR on accept"); | |
exit(1); | |
} | |
bzero(buffer,256); | |
/* Read characters from the connection, | |
then process */ | |
n = read(newsockfd,buffer,255); | |
if (n < 0) | |
{ | |
perror("ERROR reading from socket"); | |
exit(1); | |
} | |
printf("Here is the message: %s\n",buffer); | |
n = write(newsockfd,"I got your message",18); | |
if (n < 0) | |
{ | |
perror("ERROR writing to socket"); | |
exit(1); | |
} | |
/* close socket */ | |
close(sockfd); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment