-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Hao Wang
committed
May 17, 2017
1 parent
645e761
commit d201caa
Showing
100 changed files
with
2,326 additions
and
0 deletions.
There are no files selected for viewing
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
# CS438 - spring 2013 MP0 | ||
# | ||
# This is a simple example of a makefile, use this for reference when you create your own | ||
# | ||
# NOTE: if you decide to write your solution in C++, you will have to change the compiler | ||
# in this file. | ||
|
||
CC=/usr/bin/gcc | ||
CC_OPTS=-g3 | ||
CC_LIBS= | ||
CC_DEFINES= | ||
CC_INCLUDES= | ||
CC_ARGS=${CC_OPTS} ${CC_LIBS} ${CC_DEFINES} ${CC_INCLUDES} | ||
|
||
# clean is not a file | ||
.PHONY=clean | ||
|
||
#target "all" depends on all others | ||
all: client server listener talker mp0client | ||
|
||
# client C depends on source file client.c, if that changes, make client will | ||
# rebuild the binary | ||
mp0client: mp0client.c | ||
@${CC} ${CC_ARGS} -o mp0client mp0client.c | ||
|
||
client: client.c | ||
@${CC} ${CC_ARGS} -o client client.c | ||
|
||
listener: listener.c | ||
@${CC} ${CC_ARGS} -o listener listener.c | ||
|
||
talker: talker.c | ||
@${CC} ${CC_ARGS} -o talker talker.c | ||
|
||
server: server.c | ||
@${CC} ${CC_ARGS} -o server server.c | ||
|
||
clean: | ||
@rm -f talker server client listener mp0client *.o |
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
/* | ||
** client.c -- a stream socket client demo | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <errno.h> | ||
#include <string.h> | ||
#include <netdb.h> | ||
#include <sys/types.h> | ||
#include <netinet/in.h> | ||
#include <sys/socket.h> | ||
|
||
#include <arpa/inet.h> | ||
|
||
#define PORT "3490" // the port client will be connecting to | ||
|
||
#define MAXDATASIZE 100 // max number of bytes we can get at once | ||
|
||
// get sockaddr, IPv4 or IPv6: | ||
void *get_in_addr(struct sockaddr *sa) | ||
{ | ||
if (sa->sa_family == AF_INET) { | ||
return &(((struct sockaddr_in*)sa)->sin_addr); | ||
} | ||
|
||
return &(((struct sockaddr_in6*)sa)->sin6_addr); | ||
} | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
int sockfd, numbytes; | ||
char buf[MAXDATASIZE]; | ||
struct addrinfo hints, *servinfo, *p; | ||
int rv; | ||
char s[INET6_ADDRSTRLEN]; | ||
|
||
if (argc != 2) { | ||
fprintf(stderr,"usage: client hostname\n"); | ||
exit(1); | ||
} | ||
|
||
memset(&hints, 0, sizeof hints); | ||
hints.ai_family = AF_UNSPEC; | ||
hints.ai_socktype = SOCK_STREAM; | ||
|
||
if ((rv = getaddrinfo(argv[1], PORT, &hints, &servinfo)) != 0) { | ||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); | ||
return 1; | ||
} | ||
|
||
// loop through all the results and connect to the first we can | ||
for(p = servinfo; p != NULL; p = p->ai_next) { | ||
if ((sockfd = socket(p->ai_family, p->ai_socktype, | ||
p->ai_protocol)) == -1) { | ||
perror("client: socket"); | ||
continue; | ||
} | ||
|
||
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { | ||
close(sockfd); | ||
perror("client: connect"); | ||
continue; | ||
} | ||
|
||
break; | ||
} | ||
|
||
if (p == NULL) { | ||
fprintf(stderr, "client: failed to connect\n"); | ||
return 2; | ||
} | ||
|
||
inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), | ||
s, sizeof s); | ||
printf("client: connecting to %s\n", s); | ||
|
||
freeaddrinfo(servinfo); // all done with this structure | ||
|
||
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { | ||
perror("recv"); | ||
exit(1); | ||
} | ||
|
||
buf[numbytes] = '\0'; | ||
|
||
printf("client: received '%s'\n",buf); | ||
|
||
close(sockfd); | ||
|
||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
** listener.c -- a datagram sockets "server" demo | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <errno.h> | ||
#include <string.h> | ||
#include <sys/types.h> | ||
#include <sys/socket.h> | ||
#include <netinet/in.h> | ||
#include <arpa/inet.h> | ||
#include <netdb.h> | ||
|
||
#define MYPORT "4950" // the port users will be connecting to | ||
|
||
#define MAXBUFLEN 100 | ||
|
||
// get sockaddr, IPv4 or IPv6: | ||
void *get_in_addr(struct sockaddr *sa) | ||
{ | ||
if (sa->sa_family == AF_INET) { | ||
return &(((struct sockaddr_in*)sa)->sin_addr); | ||
} | ||
|
||
return &(((struct sockaddr_in6*)sa)->sin6_addr); | ||
} | ||
|
||
int main(void) | ||
{ | ||
int sockfd; | ||
struct addrinfo hints, *servinfo, *p; | ||
int rv; | ||
int numbytes; | ||
struct sockaddr_storage their_addr; | ||
char buf[MAXBUFLEN]; | ||
socklen_t addr_len; | ||
char s[INET6_ADDRSTRLEN]; | ||
|
||
memset(&hints, 0, sizeof hints); | ||
hints.ai_family = AF_UNSPEC; // set to AF_INET to force IPv4 | ||
hints.ai_socktype = SOCK_DGRAM; | ||
hints.ai_flags = AI_PASSIVE; // use my IP | ||
|
||
if ((rv = getaddrinfo(NULL, MYPORT, &hints, &servinfo)) != 0) { | ||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); | ||
return 1; | ||
} | ||
|
||
// loop through all the results and bind to the first we can | ||
for(p = servinfo; p != NULL; p = p->ai_next) { | ||
if ((sockfd = socket(p->ai_family, p->ai_socktype, | ||
p->ai_protocol)) == -1) { | ||
perror("listener: socket"); | ||
continue; | ||
} | ||
|
||
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { | ||
close(sockfd); | ||
perror("listener: bind"); | ||
continue; | ||
} | ||
|
||
break; | ||
} | ||
|
||
if (p == NULL) { | ||
fprintf(stderr, "listener: failed to bind socket\n"); | ||
return 2; | ||
} | ||
|
||
freeaddrinfo(servinfo); | ||
|
||
printf("listener: waiting to recvfrom...\n"); | ||
|
||
addr_len = sizeof their_addr; | ||
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, | ||
(struct sockaddr *)&their_addr, &addr_len)) == -1) { | ||
perror("recvfrom"); | ||
exit(1); | ||
} | ||
|
||
printf("listener: got packet from %s\n", | ||
inet_ntop(their_addr.ss_family, | ||
get_in_addr((struct sockaddr *)&their_addr), | ||
s, sizeof s)); | ||
printf("listener: packet is %d bytes long\n", numbytes); | ||
buf[numbytes] = '\0'; | ||
printf("listener: packet contains \"%s\"\n", buf); | ||
|
||
close(sockfd); | ||
|
||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
/* | ||
** client.c -- a stream socket client demo | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <unistd.h> | ||
#include <errno.h> | ||
#include <string.h> | ||
#include <netdb.h> | ||
#include <sys/types.h> | ||
#include <netinet/in.h> | ||
#include <sys/socket.h> | ||
|
||
#include <arpa/inet.h> | ||
|
||
#define MAXDATASIZE 100 // max number of bytes we can get at once | ||
|
||
// get sockaddr, IPv4 or IPv6: | ||
void *get_in_addr(struct sockaddr *sa) | ||
{ | ||
if (sa->sa_family == AF_INET) { | ||
return &(((struct sockaddr_in*)sa)->sin_addr); | ||
} | ||
|
||
return &(((struct sockaddr_in6*)sa)->sin6_addr); | ||
} | ||
|
||
int main(int argc, char *argv[]) | ||
{ | ||
int sockfd, numbytes; | ||
char buf[MAXDATASIZE]; | ||
struct addrinfo hints, *servinfo, *p; | ||
int rv; | ||
char s[INET6_ADDRSTRLEN]; | ||
|
||
char *msg = "HELO\n"; | ||
char *repeat = "RECV\n"; | ||
char *bye = "BYE\n"; | ||
char *netid_part1 = "USERNAME "; | ||
char *netid_part2 = argv[3]; | ||
char *netid_part3 = "\n"; | ||
char netid[20],temp1[20],temp2[5]; | ||
strcpy(netid,netid_part1); | ||
strcpy(temp1,netid_part2); | ||
strcpy(temp2,netid_part3); | ||
strcat(netid, temp1); | ||
strcat(netid, temp2); | ||
|
||
int len, bytes_sent; | ||
|
||
if (argc != 4) { | ||
fprintf(stderr,"usage: client hostname\n"); | ||
exit(1); | ||
} | ||
|
||
memset(&hints, 0, sizeof hints); | ||
hints.ai_family = AF_UNSPEC; | ||
hints.ai_socktype = SOCK_STREAM; | ||
|
||
if ((rv = getaddrinfo(argv[1], argv[2], &hints, &servinfo)) != 0) { | ||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); | ||
return 1; | ||
} | ||
|
||
// loop through all the results and connect to the first we can | ||
for(p = servinfo; p != NULL; p = p->ai_next) { | ||
if ((sockfd = socket(p->ai_family, p->ai_socktype, | ||
p->ai_protocol)) == -1) { | ||
perror("client: socket"); | ||
continue; | ||
} | ||
|
||
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { | ||
close(sockfd); | ||
perror("client: connect"); | ||
continue; | ||
} | ||
|
||
break; | ||
} | ||
|
||
if (p == NULL) { | ||
fprintf(stderr, "client: failed to connect\n"); | ||
return 2; | ||
} | ||
|
||
// inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), | ||
// s, sizeof s); | ||
|
||
freeaddrinfo(servinfo); // all done with this structure | ||
|
||
// HELO -> 100 - OK | ||
len = strlen(msg); | ||
bytes_sent = send(sockfd, msg, len, 0); | ||
if(len != bytes_sent){ // check number of bytes sent | ||
perror("send"); | ||
exit(1); | ||
} | ||
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { | ||
perror("recv"); | ||
exit(1); | ||
} | ||
|
||
// USERNAME haow4 -> 200 - Username: haow4 | ||
len = strlen(netid); | ||
bytes_sent = send(sockfd, netid, len, 0); | ||
if(len != bytes_sent){ // check number of bytes sent | ||
perror("send"); | ||
exit(1); | ||
} | ||
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { | ||
perror("recv"); | ||
exit(1); | ||
} | ||
|
||
// Repeat RECV | ||
len = strlen(repeat); | ||
for(int i = 0; i < 10; i++){ | ||
bytes_sent = send(sockfd, repeat, len, 0); | ||
if(len != bytes_sent){ // check number of bytes sent | ||
perror("send"); | ||
exit(1); | ||
} | ||
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { | ||
perror("recv"); | ||
exit(1); | ||
} | ||
buf[numbytes] = '\0'; | ||
printf("Received: %s", buf+12); | ||
} | ||
|
||
// Send bye | ||
len = strlen(bye); | ||
bytes_sent = send(sockfd, bye, len, 0); | ||
if(len != bytes_sent){ // check number of bytes sent | ||
perror("send"); | ||
exit(1); | ||
} | ||
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { | ||
perror("recv"); | ||
exit(1); | ||
} | ||
buf[numbytes] = '\0'; | ||
|
||
close(sockfd); | ||
|
||
return 0; | ||
} |
Oops, something went wrong.