-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.c
151 lines (119 loc) · 2.53 KB
/
server.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<sys/un.h>
#include<netdb.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<iostream>
using namespace std;
enum IFACE{
IP_1,
IP_2,
IP_3,
IP_4,
IP_5,
IP_6,
IP_MAX
};
struct Socket{
char address[60];
int port;
};
struct Socket *readLocalIP(IFACE addr)
{
char * var;
int port;
Socket *socket;
socket = (Socket*)malloc(sizeof(struct Socket));
switch(addr){
case IP_1:
var = getenv("IP_1");
port = 61000;
break;
case IP_2:
var = getenv("IP_2");
port = 61001;
break;
case IP_3:
var = getenv("IP_3");
port = 61002;
break;
case IP_4:
var = getenv("IP_4");
port = 61003;
break;
case IP_5:
var = getenv("IP_5");
port = 61004;
break;
case IP_6:
var = getenv("IP_6");
port = 61005;
break;
default:
break;
}
if (!var){
var = "158.185.95.100";
port = 61000;
}
strcpy(socket->address, var);
socket->port = port;
return socket;
}
int init(Socket *sock){
int socketFd;
int ret;
socketFd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in localSocket;
localSocket.sin_family = AF_INET;
localSocket.sin_addr.s_addr = inet_addr(sock->address);
localSocket.sin_port = htons(sock->port);
ret = bind(socketFd, (struct sockaddr*) &localSocket, sizeof(localSocket));
if (ret == 0){
cout << "Successful bind on : " << sock->address << endl;
}
else{
cout << "Failed to bind on : " << sock->address << endl;
}
return socketFd;
}
void listen(int sockId, Socket *sock, char *clientIp) {
char msg_send[256], msg_rev[256];
struct sockaddr_in client;
socklen_t addr_size;
addr_size = sizeof(struct sockaddr_in);
int acc = accept(sockId, (struct sockaddr*) &client, &addr_size);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(client.sin_addr), clientIp, INET_ADDRSTRLEN);
printf("connection established with IP : %s and PORT : %d\n",
clientIp, ntohs(client.sin_port));
recv(acc, msg_rev, 256, 0);
cout << "Client acknowledge " << msg_rev << endl;
strcpy(msg_send, "Received");
send(acc, msg_send, 256, 0);
}
int main(int argc, char *argv[]) {
Socket *sock[IP_MAX];
int socketFd;
char *clientIp[IP_MAX];
int i;
for (i = 0; i < IP_MAX; i++){
sock[i] = readLocalIP((IFACE)i);
if (sock[i]){
socketFd = init(sock[i]);
}
else{
cout << "failed to create socket " + i << endl;
}
listen(socketFd, 5);
}
while(1){
}
for (int i = 0; i < IP_MAX; i++){
free(sock[i]);
}
return 0;
}