Skip to content

Commit c31730e

Browse files
author
Walker Ford
committed
Working initial commit
0 parents  commit c31730e

File tree

6 files changed

+191
-0
lines changed

6 files changed

+191
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.*
2+
!.gitignore
3+
build

CMakeLists.txt

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
cmake_minimum_required(VERSION 3.0.0)
2+
# set(CMAKE_VERBOSE_MAKEFILE ON)
3+
4+
add_executable(tcpServer server.cpp)
5+
target_compile_features(tcpServer PUBLIC cxx_std_17)
6+
7+
add_executable(tcpClient client.cpp)
8+
target_compile_features(tcpClient PUBLIC cxx_std_17)

client.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include <iostream>
2+
#include <string>
3+
4+
#include <sys/socket.h> // socket(), connect()
5+
#include <netinet/in.h> // sockaddr_in
6+
#include <unistd.h> // read(), send()
7+
#include <arpa/inet.h> // inet_pton()
8+
9+
#include "config.h"
10+
11+
int main(int argCount, char *argValues[])
12+
{
13+
// Create socketDescriptor
14+
int socketDescriptor = socket(
15+
AF_INET,
16+
SOCK_STREAM,
17+
0
18+
);
19+
20+
if (-1 == socketDescriptor)
21+
{
22+
// Handle socket() error
23+
std::cerr << "socket() error" << std::endl;
24+
return -1;
25+
}
26+
27+
// Create socketAddress
28+
struct sockaddr_in socketAddress;
29+
memset(&socketAddress, 0, sizeof(socketAddress));
30+
socketAddress.sin_family = AF_INET;
31+
socketAddress.sin_port = htons(portNumber);
32+
33+
int result = inet_pton(
34+
AF_INET,
35+
"127.0.0.1",
36+
&socketAddress.sin_addr);
37+
38+
if (-1 == result)
39+
{
40+
// Handle inet_pton() error
41+
std::cerr << "inet_pton() error" << std::endl;
42+
return -1;
43+
}
44+
45+
result = connect(
46+
socketDescriptor,
47+
reinterpret_cast<sockaddr*>(&socketAddress),
48+
sizeof(socketAddress));
49+
50+
if (-1 == result)
51+
{
52+
// Handle connect() error
53+
std::cerr << "connect() error" << std::endl;
54+
return -1;
55+
}
56+
57+
char message[] = "walker";
58+
59+
send(
60+
socketDescriptor,
61+
message,
62+
strlen(message),
63+
0);
64+
65+
std::cout << "Message sent: " << message << std::endl;
66+
67+
sleep(5);
68+
69+
return 0;
70+
}

config.h

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
constexpr int portNumber = 5000;

main.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#include <iostream>
2+
3+
int main(int, char**) {
4+
std::cout << "Hello, world!\n";
5+
}

server.cpp

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#include <iostream>
2+
#include <string>
3+
4+
#include <sys/socket.h> // socket(), listen(), accept()
5+
#include <netinet/in.h> // sockaddr_in
6+
#include <unistd.h> // read()
7+
8+
#include "config.h"
9+
10+
int main(int argCount, char *argValues[])
11+
{
12+
// Create socketDescriptor
13+
int socketDescriptor = socket(
14+
AF_INET,
15+
SOCK_STREAM,
16+
0);
17+
18+
if (-1 == socketDescriptor)
19+
{
20+
// Handle socket() error
21+
std::cerr << "socket() error" << std::endl;
22+
return -1;
23+
}
24+
25+
// Create socketAddress
26+
struct sockaddr_in socketAddress;
27+
memset(&socketAddress, 0, sizeof(socketAddress));
28+
socketAddress.sin_family = AF_INET;
29+
socketAddress.sin_addr.s_addr = INADDR_ANY;
30+
socketAddress.sin_port = htons(portNumber);
31+
32+
// Bind address to socket
33+
int bindResult = bind(
34+
socketDescriptor,
35+
reinterpret_cast<sockaddr*>(&socketAddress),
36+
sizeof(socketAddress));
37+
38+
if (0 != bindResult)
39+
{
40+
// Handle bind() error
41+
std::cerr << "bind() error" << std::endl;
42+
return -1;
43+
}
44+
45+
// Set socket options
46+
// int socketOptions = 1;
47+
// if (setsockopt(
48+
// socketDescriptor,
49+
// SOL_SOCKET,
50+
// SO_REUSEADDR | SO_REUSEPORT,
51+
// &socketOptions,
52+
// sizeof(socketOptions)))
53+
// {
54+
// std::cerr << "setsockopt() error" << std::endl;
55+
// return(-1);
56+
// }
57+
58+
// Listen for connections
59+
listen(socketDescriptor, SOMAXCONN);
60+
61+
while (1)
62+
{
63+
sockaddr_in clientAddress;
64+
int clientDescriptor;
65+
socklen_t clientLength = sizeof(clientAddress);
66+
67+
// Accept new connection
68+
clientDescriptor = accept(
69+
socketDescriptor,
70+
reinterpret_cast<sockaddr*>(&clientAddress),
71+
&clientLength);
72+
73+
if (-1 == clientDescriptor)
74+
{
75+
// Handle accept() error
76+
std::cerr << "accept() error" << std::endl;
77+
return -1;
78+
}
79+
80+
while (1)
81+
{
82+
int byteCount;
83+
char buffer[1024];
84+
85+
// Read in data
86+
byteCount = read(
87+
clientDescriptor,
88+
buffer,
89+
sizeof(buffer));
90+
91+
if (byteCount <= 0)
92+
{
93+
// Handle read() error
94+
std::cerr << "read() error" << std::endl;
95+
break;
96+
}
97+
98+
// Handle data
99+
std::cout << "Received: " << buffer << std::endl;
100+
}
101+
}
102+
}

0 commit comments

Comments
 (0)