Created
February 15, 2019 15:49
-
-
Save yulewei/e18021b0332acc20b8e738e124eceb61 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
/* This page contains the client program. The following one contains the | |
* server program. Once the server has been compiled and started, clients | |
* anywhere on the Internet can send commands (file names) to the server. | |
* The server responds by opening and returning the entire file requested. | |
*/ | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
#include <stdio.h> | |
#define SERVER_PORT 12345 /* arbitrary, but client and server must agree */ | |
#define BUF_SIZE 4096 /* block transfer size */ | |
int main(int argc, char **argv) | |
{ | |
int c, s, bytes; | |
char buf[BUF_SIZE]; /* buffer for incoming file */ | |
char obuf[BUF_SIZE]; /* buffer for outgoing file */ | |
struct hostent *h; /* info about server */ | |
struct sockaddr_in channel; /* holds IP address */ | |
if (argc != 3) fatal("Usage: client server-name file-name"); | |
h = gethostbyname(argv[1]); /* look up host's IP address */ | |
if (!h) fatal("gethostbyname failed"); | |
s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); | |
if (s < 0) fatal("socket"); | |
memset(&channel, 0, sizeof(channel)); | |
channel.sin_family= AF_INET; | |
memcpy(&channel.sin_addr.s_addr, h->h_addr, h->h_length); | |
channel.sin_port= htons(SERVER_PORT); | |
c = connect(s, (struct sockaddr *) &channel, sizeof(channel)); | |
if (c < 0) fatal("connect failed"); | |
/* Connection is now established. Send file name including 0 byte at end. */ | |
write(s, argv[2], strlen(argv[2])+1); | |
/* Go get the file and write it to a local file | |
(new or existing, overwritten) of the same name. */ | |
FILE *dst; | |
sprintf(obuf, "out/%s", argv[2]); | |
dst = fopen(obuf, "w+"); | |
while (1) { | |
bytes = read(s, buf, BUF_SIZE); /* read from socket */ | |
if (bytes <= 0) exit(0); /* check for end of file */ | |
fwrite(buf, sizeof(char), bytes, dst); | |
// write(1, buf, bytes); /* write to standard output */ | |
} | |
fclose(dst); | |
} | |
fatal(char *string) | |
{ | |
printf("%s\n", string); | |
exit(1); | |
} |
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 <sys/types.h> | |
#include <sys/fcntl.h> | |
#include <sys/socket.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
#define SERVER_PORT 12345 /* arbitrary, but client and server must agree */ | |
#define BUF_SIZE 4096 /* block transfer size */ | |
#define QUEUE_SIZE 10 | |
int main(int argc, char *argv[]) | |
{ | |
int s, b, l, fd, sa, bytes, on = 1; | |
char buf[BUF_SIZE]; /* buffer for outgoing file */ | |
struct sockaddr_in channel; /* hold's IP address */ | |
/* Build address structure to bind to socket. */ | |
memset(&channel, 0, sizeof(channel)); /* zero channel */ | |
channel.sin_family = AF_INET; | |
channel.sin_addr.s_addr = htonl(INADDR_ANY); | |
channel.sin_port = htons(SERVER_PORT); | |
/* Passive open. Wait for connection. */ | |
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); /* create socket */ | |
if (s < 0) fatal("socket failed"); | |
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)); | |
b = bind(s, (struct sockaddr *) &channel, sizeof(channel)); | |
if (b < 0) fatal("bind failed"); | |
l = listen(s, QUEUE_SIZE); /* specify queue size */ | |
if (l < 0) fatal("listen failed"); | |
/* Socket is now set up and bound. Wait for connection and process it. */ | |
while (1) { | |
sa = accept(s, 0, 0); /* block for connection request */ | |
if (sa < 0) fatal("accept failed"); | |
read(sa, buf, BUF_SIZE); /* read file name from socket */ | |
/* Get and return the file. */ | |
fd = open(buf, O_RDONLY); /* open the file to be sent back */ | |
if (fd < 0) fatal("open failed"); | |
while (1) { | |
bytes = read(fd, buf, BUF_SIZE); /* read from file */ | |
if (bytes <= 0) break; /* check for end of file */ | |
write(sa, buf, bytes); /* write bytes to socket */ | |
} | |
close(fd); /* close file */ | |
close(sa); /* close connection */ | |
} | |
} | |
fatal(char *string) | |
{ | |
printf("%s", string); | |
exit(1); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment