Skip to content

Commit 3bcab55

Browse files
committed
1 parent b6dc5ad commit 3bcab55

File tree

16 files changed

+824
-0
lines changed

16 files changed

+824
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# This code depends on make tool being used
2+
DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES}))
3+
ifneq (${DEPFILES},)
4+
include ${DEPFILES}
5+
endif
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#
2+
# There exist several targets which are by default empty and which can be
3+
# used for execution of your targets. These targets are usually executed
4+
# before and after some main targets. They are:
5+
#
6+
# .build-pre: called before 'build' target
7+
# .build-post: called after 'build' target
8+
# .clean-pre: called before 'clean' target
9+
# .clean-post: called after 'clean' target
10+
# .clobber-pre: called before 'clobber' target
11+
# .clobber-post: called after 'clobber' target
12+
# .all-pre: called before 'all' target
13+
# .all-post: called after 'all' target
14+
# .help-pre: called before 'help' target
15+
# .help-post: called after 'help' target
16+
#
17+
# Targets beginning with '.' are not intended to be called on their own.
18+
#
19+
# Main targets can be executed directly, and they are:
20+
#
21+
# build build a specific configuration
22+
# clean remove built files from a configuration
23+
# clobber remove all built files
24+
# all build all configurations
25+
# help print help mesage
26+
#
27+
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
28+
# .help-impl are implemented in nbproject/makefile-impl.mk.
29+
#
30+
# Available make variables:
31+
#
32+
# CND_BASEDIR base directory for relative paths
33+
# CND_DISTDIR default top distribution directory (build artifacts)
34+
# CND_BUILDDIR default top build directory (object files, ...)
35+
# CONF name of current configuration
36+
# CND_PLATFORM_${CONF} platform name (current configuration)
37+
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
38+
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
39+
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
40+
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
41+
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
42+
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
43+
#
44+
# NOCDDL
45+
46+
47+
# Environment
48+
MKDIR=mkdir
49+
CP=cp
50+
CCADMIN=CCadmin
51+
52+
53+
# build
54+
build: .build-post
55+
56+
.build-pre:
57+
# Add your pre 'build' code here...
58+
59+
.build-post: .build-impl
60+
# Add your post 'build' code here...
61+
62+
63+
# clean
64+
clean: .clean-post
65+
66+
.clean-pre:
67+
# Add your pre 'clean' code here...
68+
69+
.clean-post: .clean-impl
70+
# Add your post 'clean' code here...
71+
72+
73+
# clobber
74+
clobber: .clobber-post
75+
76+
.clobber-pre:
77+
# Add your pre 'clobber' code here...
78+
79+
.clobber-post: .clobber-impl
80+
# Add your post 'clobber' code here...
81+
82+
83+
# all
84+
all: .all-post
85+
86+
.all-pre:
87+
# Add your pre 'all' code here...
88+
89+
.all-post: .all-impl
90+
# Add your post 'all' code here...
91+
92+
93+
# build tests
94+
build-tests: .build-tests-post
95+
96+
.build-tests-pre:
97+
# Add your pre 'build-tests' code here...
98+
99+
.build-tests-post: .build-tests-impl
100+
# Add your post 'build-tests' code here...
101+
102+
103+
# run tests
104+
test: .test-post
105+
106+
.test-pre:
107+
# Add your pre 'test' code here...
108+
109+
.test-post: .test-impl
110+
# Add your post 'test' code here...
111+
112+
113+
# help
114+
help: .help-post
115+
116+
.help-pre:
117+
# Add your pre 'help' code here...
118+
119+
.help-post: .help-impl
120+
# Add your post 'help' code here...
121+
122+
123+
124+
# include project implementation makefile
125+
include nbproject/Makefile-impl.mk
126+
127+
# include project make variables
128+
include nbproject/Makefile-variables.mk
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
build/Debug/Cygwin_4.x-Windows/main.o: main.cpp
75.9 KB
Binary file not shown.
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include <sys/types.h>
2+
#include <sys/socket.h>
3+
#include <netinet/in.h>
4+
#include <arpa/inet.h>
5+
#include <iostream>
6+
#include <string>
7+
#include <sstream>
8+
#include <fstream>
9+
#include <cerrno>
10+
#include <stdlib.h>
11+
#include <signal.h>
12+
#include <sys/wait.h>
13+
#include <cstdlib>
14+
#include <vector>
15+
#include <string.h>
16+
17+
using namespace std;
18+
19+
string readFromSocket(int clinetfd) {
20+
char buf[1024]; // a bit stupid way to mimick an istream
21+
int received_count = recv(clinetfd, buf, 1024, MSG_DONTWAIT);
22+
if (received_count <= 0) return false;
23+
return string(buf, buf + received_count);
24+
}
25+
26+
int main(int argc, char** argv) {
27+
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
28+
int port = 777;
29+
char x = 1;
30+
31+
//set keep alive opt
32+
if (setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (const char*) &x, sizeof (x)) == -1) {
33+
cerr << "failed to set socket option: SO_KEEPALIVE" << strerror(errno) << endl;
34+
close(sockfd);
35+
return 1;
36+
}
37+
//set reuse socket opt
38+
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*) &x, sizeof (x)) == -1) {
39+
cerr << "failed to set socket option: SO_REUSEADDR" << strerror(errno) << endl;
40+
close(sockfd);
41+
return 2;
42+
}
43+
44+
struct sockaddr_in sa;
45+
sa.sin_family = AF_INET;
46+
sa.sin_port = htons(port);
47+
sa.sin_addr.s_addr = htonl(INADDR_ANY);
48+
if (bind(sockfd, (sockaddr *) & sa, sizeof (sa)) < 0) {
49+
cerr << "failed to bind:" << strerror(errno) << endl;
50+
close(sockfd);
51+
return 3;
52+
}
53+
if (listen(sockfd, 1) < 0) {
54+
cerr << "failed to listen:" << strerror(errno) << endl;
55+
close(sockfd);
56+
return 4;
57+
}
58+
59+
while (true) {
60+
cout << "Server is listening and waiting for accept..." << endl;
61+
62+
// TODO: This is blocking unless the current connection is closed! How can it be fixed???
63+
cout << "Before accept" << endl;
64+
int clientfd = accept(sockfd, 0, 0);
65+
cout << "After accept" << endl;
66+
if (clientfd < 0) {
67+
cerr << "failed to accept:" << strerror(errno) << endl;
68+
close(sockfd);
69+
return 5;
70+
}
71+
72+
//pid_t parentId = getpid();
73+
if (fork() == 0) { // Child process
74+
close(sockfd);
75+
string request = readFromSocket(clientfd);
76+
cout << "Request:" << endl << "******" << endl << request << "******" << endl;
77+
string response(request + "BlaBlaBla" + "\r\n");
78+
cout << "Simulating long request processing time" << endl;
79+
for (int i = 0; i < 25; ++i) {
80+
cout << "-";
81+
}
82+
cout << endl;
83+
for (int i = 0; i < 25; ++i) {
84+
cout << "=" << flush;
85+
usleep(200000);
86+
}
87+
cout << endl << "Done!" << endl;
88+
89+
cout << "Response:" << endl << "******" << endl << response << "******" << endl;
90+
write(clientfd, response.c_str(), response.length());
91+
cout << "*** Request done ***" << endl << endl;
92+
close(clientfd);
93+
exit(1);
94+
}
95+
close(clientfd);
96+
}
97+
98+
close(sockfd);
99+
return 0;
100+
}
101+
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#
2+
# Generated Makefile - do not edit!
3+
#
4+
# Edit the Makefile in the project folder instead (../Makefile). Each target
5+
# has a -pre and a -post target defined where you can add customized code.
6+
#
7+
# This makefile implements configuration specific macros and targets.
8+
9+
10+
# Environment
11+
MKDIR=mkdir
12+
CP=cp
13+
GREP=grep
14+
NM=nm
15+
CCADMIN=CCadmin
16+
RANLIB=ranlib
17+
CC=gcc.exe
18+
CCC=g++.exe
19+
CXX=g++.exe
20+
FC=gfortran.exe
21+
AS=as.exe
22+
23+
# Macros
24+
CND_PLATFORM=Cygwin_4.x-Windows
25+
CND_CONF=Debug
26+
CND_DISTDIR=dist
27+
28+
# Include project Makefile
29+
include Makefile
30+
31+
# Object Directory
32+
OBJECTDIR=build/${CND_CONF}/${CND_PLATFORM}
33+
34+
# Object Files
35+
OBJECTFILES= \
36+
${OBJECTDIR}/main.o
37+
38+
39+
# C Compiler Flags
40+
CFLAGS=
41+
42+
# CC Compiler Flags
43+
CCFLAGS=
44+
CXXFLAGS=
45+
46+
# Fortran Compiler Flags
47+
FFLAGS=
48+
49+
# Assembler Flags
50+
ASFLAGS=
51+
52+
# Link Libraries and Options
53+
LDLIBSOPTIONS=
54+
55+
# Build Targets
56+
.build-conf: ${BUILD_SUBPROJECTS}
57+
"${MAKE}" -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/pnprog_multiprocess_server_test.exe
58+
59+
dist/Debug/Cygwin_4.x-Windows/pnprog_multiprocess_server_test.exe: ${OBJECTFILES}
60+
${MKDIR} -p dist/Debug/Cygwin_4.x-Windows
61+
${LINK.cc} -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/pnprog_multiprocess_server_test ${OBJECTFILES} ${LDLIBSOPTIONS}
62+
63+
${OBJECTDIR}/main.o: nbproject/Makefile-${CND_CONF}.mk main.cpp
64+
${MKDIR} -p ${OBJECTDIR}
65+
${RM} $@.d
66+
$(COMPILE.cc) -g -MMD -MP -MF $@.d -o ${OBJECTDIR}/main.o main.cpp
67+
68+
# Subprojects
69+
.build-subprojects:
70+
71+
# Clean Targets
72+
.clean-conf: ${CLEAN_SUBPROJECTS}
73+
${RM} -r build/Debug
74+
${RM} dist/Debug/Cygwin_4.x-Windows/pnprog_multiprocess_server_test.exe
75+
76+
# Subprojects
77+
.clean-subprojects:
78+
79+
# Enable dependency checking
80+
.dep.inc: .depcheck-impl
81+
82+
include .dep.inc

0 commit comments

Comments
 (0)