Skip to content

Commit 6730380

Browse files
committed
Add simple TCP/IP com using BSD Sockets API
0 parents  commit 6730380

File tree

4 files changed

+238
-0
lines changed

4 files changed

+238
-0
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
server_z1-backup.c
2+
.vscode
3+
sockets/
4+
5+
char
6+
cryptodev
7+
mycryptodev
8+
virtio-cryptodev
9+
z2
10+

basic-chat-tool/Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
all: client_z1 server_z1
2+
.PHONY:all
3+
4+
client_z1: client_z1.c
5+
gcc client_z1.c -o client_z1
6+
7+
server_z1: server_z1.c
8+
gcc server_z1.c -o server_z1

basic-chat-tool/client_z1.c

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* socket-client.c
3+
* Simple TCP/IP communication using sockets
4+
*
5+
* Markos Girgis <mg.markosgirgis@gmail.com>
6+
*/
7+
#include <stdio.h>
8+
#include <sys/types.h>
9+
#include <sys/socket.h>
10+
#include <errno.h>
11+
#include <string.h>
12+
#include <stdlib.h>
13+
#include <arpa/inet.h>
14+
#include <unistd.h>
15+
#include <sys/select.h>
16+
17+
18+
int main(int argc, char *argv[]) {
19+
20+
if (argc != 3) {
21+
printf("Plese enter 2 arguments, hostname and port\n");
22+
return -1;
23+
}
24+
int client_s, ret_val;
25+
uint16_t port;
26+
fd_set rd_fds;
27+
struct timeval tv;
28+
if ((port = atoi(argv[2])) == 0) {
29+
printf("Please enter a valid port number\n");
30+
return -1;
31+
}
32+
struct sockaddr_in addr;
33+
addr.sin_family = AF_INET;
34+
//ensure network byte
35+
addr.sin_port = htons(port);
36+
if ((client_s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
37+
perror("socket() failed");
38+
return -1;
39+
}
40+
if (inet_pton(AF_INET, argv[1], &addr.sin_addr.s_addr) <= 0) {
41+
printf("Oops inet_pton failed\n");
42+
return -1;
43+
}
44+
45+
if (connect(client_s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
46+
perror("connect() failed");
47+
return -1;
48+
}
49+
char msg[1024] = "Hello, im client!";
50+
char buf[1024];
51+
memset(msg, 0, sizeof(msg));
52+
memset(buf, 0, sizeof(buf));
53+
char end_msg[4] = "bye";
54+
while (strcmp(buf, "bye")) {
55+
FD_ZERO(&rd_fds);
56+
FD_SET(STDIN_FILENO, &rd_fds);
57+
FD_SET(client_s, &rd_fds);
58+
tv.tv_sec = 0;
59+
tv.tv_usec = 0;
60+
ret_val = select(client_s + 1, &rd_fds, NULL, NULL, &tv);
61+
if (ret_val == -1)
62+
perror("Select()");
63+
else if (ret_val) {
64+
if(FD_ISSET(STDIN_FILENO, &rd_fds) != 0 && FD_ISSET(client_s, &rd_fds) != 0) {
65+
//corner case
66+
memset(msg, 0, strlen(msg));
67+
if (read(STDIN_FILENO, msg, sizeof(msg)) < 0) {
68+
perror("stdin read()");
69+
exit(EXIT_FAILURE);
70+
}
71+
send(client_s, msg, strlen(msg), 0);
72+
memset(buf, 0, strlen(buf));
73+
recv(client_s, buf, 1024, 0);
74+
printf("-%s\n", buf);
75+
} else if(FD_ISSET(STDIN_FILENO, &rd_fds) != 0) {
76+
memset(msg, 0, strlen(msg));
77+
if (read(STDIN_FILENO, msg, sizeof(msg)) < 0) {
78+
perror("stdin read()");
79+
exit(EXIT_FAILURE);
80+
}
81+
send(client_s, msg, strlen(msg), 0);
82+
} else if (FD_ISSET(client_s, &rd_fds) != 0) {
83+
memset(buf, 0, strlen(buf));
84+
recv(client_s, buf, 1024, 0);
85+
printf("-%s\n", buf);
86+
}
87+
}
88+
}
89+
close(client_s);
90+
return 0;
91+
92+
93+
94+
}

basic-chat-tool/server_z1.c

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
#include <stdlib.h>
2+
#include <sys/socket.h>
3+
#include <sys/types.h>
4+
#include <string.h>
5+
#include <arpa/inet.h>
6+
#include <stdio.h>
7+
#include <netinet/in.h>
8+
#include <unistd.h>
9+
#include <sys/select.h>
10+
11+
int main(int argc, char *argv[])
12+
{
13+
if (argc != 2) {
14+
printf("Please give 1 argument, Port");
15+
exit(EXIT_FAILURE);
16+
}
17+
uint16_t port;
18+
int server_s, com_socket, ret_val;
19+
struct sockaddr_in addr;
20+
fd_set rd_fds, wr_fds;
21+
struct timeval tv;
22+
char buffer[512];
23+
/*
24+
int retval;
25+
tv.tv_sec = 5;
26+
tv.tv_usec = 5;
27+
retval = select(1, &rd_fds, NULL, NULL, &tv);
28+
29+
if (retval == -1)
30+
perror("select()");
31+
else if (retval) {
32+
if (FD_ISSET(STDIN_FILENO, &rd_fds) != 0) {
33+
printf("Data is available now.\n");
34+
read(STDIN_FILENO, buffer, sizeof(buffer));
35+
printf("%s\n", buffer);
36+
} else {
37+
printf("Unexpected result\n");
38+
}
39+
}
40+
else
41+
printf("No data within five seconds\n");
42+
exit(EXIT_SUCCESS);
43+
}
44+
*/
45+
46+
47+
if ((port=atoi(argv[1])) == 0) {
48+
printf("Please enter a valid port number\n");
49+
exit(EXIT_FAILURE);
50+
}
51+
52+
if ((server_s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
53+
perror("socket() failed");
54+
exit(EXIT_FAILURE);
55+
}
56+
addr.sin_family = AF_INET;
57+
addr.sin_addr.s_addr = INADDR_ANY;
58+
addr.sin_port = htons(port);
59+
60+
if (bind(server_s, (struct sockaddr *)&addr,sizeof(addr)) < 0) {
61+
perror("bind() failed");
62+
exit(EXIT_FAILURE);
63+
}
64+
if (listen(server_s, 1) < 0) {
65+
perror("listen() failed");
66+
exit(EXIT_FAILURE);
67+
}
68+
int addr_len = sizeof(addr);
69+
printf("Server waiting on port %hu...\n", port);
70+
if ((com_socket = accept(server_s, (struct sockaddr *)&addr, (socklen_t*) &addr_len)) < 0 ) {
71+
perror("accept() failed");
72+
exit(EXIT_FAILURE);
73+
}
74+
printf("Server has accepted client\n");
75+
char msg[1024] = {0};
76+
char buf[1024] = {0};
77+
memset(msg, 0, sizeof(msg));
78+
memset(buf, 0, sizeof(buf));
79+
printf("Accepting messages up to 1024 bytes long :=)\n");
80+
ssize_t received;
81+
while(1) {
82+
FD_ZERO(&rd_fds);
83+
FD_ZERO(&wr_fds);
84+
FD_SET(STDIN_FILENO, &rd_fds);
85+
FD_SET(com_socket, &rd_fds);
86+
tv.tv_sec = 0;
87+
tv.tv_usec = 0;
88+
ret_val = select(com_socket + 1, &rd_fds, NULL, NULL, &tv);
89+
if (ret_val == -1)
90+
perror("select()");
91+
else if (ret_val) {
92+
if (FD_ISSET(STDIN_FILENO, &rd_fds) != 0 && FD_ISSET(com_socket, &rd_fds) != 0) {
93+
//corner case
94+
memset(buf, 0, strlen(buf));
95+
received = recv(com_socket, buf, 1024,0);
96+
if (received == 0) {
97+
close(com_socket);
98+
close(server_s);
99+
break;
100+
}
101+
printf("-%s\n", buf);
102+
memset(msg, 0, strlen(msg));
103+
read(STDIN_FILENO, msg, sizeof(msg));
104+
send(com_socket, msg, strlen(msg), 0);
105+
}else if (FD_ISSET(STDIN_FILENO, &rd_fds) != 0) {
106+
memset(msg, 0, strlen(msg));
107+
read(STDIN_FILENO, msg, sizeof(msg));
108+
send(com_socket, msg, strlen(msg), 0);
109+
} else if (FD_ISSET(com_socket, &rd_fds) != 0) {
110+
memset(buf, 0, strlen(buf));
111+
received = recv(com_socket, buf, 1024,0);
112+
if (received == 0) {
113+
close(com_socket);
114+
close(server_s);
115+
break;
116+
}
117+
printf("-%s\n", buf);
118+
} else {
119+
printf("Unexpected result\n");
120+
exit(EXIT_FAILURE);
121+
}
122+
}
123+
}
124+
return 0;
125+
}
126+

0 commit comments

Comments
 (0)