-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunction.c
More file actions
176 lines (139 loc) · 3.21 KB
/
Copy pathfunction.c
File metadata and controls
176 lines (139 loc) · 3.21 KB
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "function.h"
void* serverTCP()
{
int queue1;
int nfds = 1;
int newSocket;
int socketTCP;
int sizeRead;
int i = 0;
key_t key1;
//char buffer[BUFFER_SIZE];
struct message mes;
struct sockaddr_in server;
struct pollfd fds[BUFSIZ];
key1 = ftok(".", 'a');
mes.id_message = 1;
if((queue1 = (msgget(key1, 0666 | IPC_CREAT))) == -1)
errorMessage("msgget serverTCP");
socketTCP = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
set_nonblock(socketTCP);
server.sin_family = AF_INET;
server.sin_port = htons(12345);
server.sin_addr.s_addr = htonl(INADDR_ANY);
if((bind(socketTCP, (struct sockaddr*)&server, sizeof(server))) == -1)
errorMessage("binding");
listen(socketTCP, SOMAXCONN);
fds[0].fd = socketTCP;
fds[0].events = POLLIN;
while(1)
{
poll(fds, nfds, 0);
for(i = 0; i < nfds; ++i)
{
if(fds[i].revents & POLLIN)
{
if(fds[i].fd == socketTCP)
{
newSocket = accept(socketTCP, 0, 0);
fds[nfds].fd = newSocket;
fds[nfds].events = POLLIN;
set_nonblock(fds[nfds].fd);
++nfds;
}
else
{
sizeRead = recv(fds[i].fd, mes.client.some_text, BUFFER_SIZE, MSG_NOSIGNAL);
mes.client.some_text[sizeRead] = '\0';
switch(sizeRead)
{
case 0:
shutdown(fds[i].fd, SHUT_RDWR);
close(fds[i].fd);
break;
default:
mes.client.fd_client = fds[i].fd;
if((msgsnd(queue1, (void*)&mes, sizeof(mes.client), 0)) == -1)
errorMessage("msgsnd serverTCP");
break;
}
}
}
}
}
}
void* thread_1()
{
int queue1, queue2;
key_t key1, key2;
key1 = ftok(".", 'a');
key2 = ftok(".", 'b');
struct message mes2;
mes2.id_message = 1;
if((queue1 = msgget(key1, 0666 | IPC_CREAT)) == -1)
errorMessage("thread_1 msgget1");
if((queue2 = msgget(key2, 0666 | IPC_CREAT)) == -1)
errorMessage("thread_1 msgget2");
while(1)
{
msgrcv(queue1, (void*)&mes2, sizeof(mes2.client), 0, 0);
if(strncmp(mes2.client.some_text, "data", 4) == 0)
{
strcpy(mes2.client.some_text, "Month april");
}
else if(strncmp(mes2.client.some_text, "info", 4) == 0)
{
infoComputer(mes2.client.some_text);
}
else if(strncmp(mes2.client.some_text, "end", 3) == 0)
{
break;
}
else
{
strcpy(mes2.client.some_text, "Incorrect request. Try again");
}
if((msgsnd(queue2, (void*)&mes2, sizeof(mes2.client), 0)) == -1)
errorMessage("msgsnd thread1");
}
msgctl(queue2, IPC_RMID, 0);
pthread_exit(NULL);
}
void* thread_2()
{
int queue2;
key_t key2;
key2 = ftok(".", 'b');
if((queue2 = msgget(key2, 0666 | IPC_CREAT)) == -1)
errorMessage("msgget thread_2");
struct message mes;
while(1)
{
if((msgrcv(queue2, (void*)&mes, sizeof(mes.client), 0, 0)) == -1)
errorMessage("msgrcv thread_2");
send(mes.client.fd_client, mes.client.some_text, BUFSIZ, MSG_NOSIGNAL);
}
}
void infoComputer(char* str)
{
char hostName[80];
gethostname(hostName, 80);
sprintf(str, "Hostname computer is %s", hostName);
}
void errorMessage(char* str)
{
perror(str);
exit(0);
}
int set_nonblock(int fd)
{
int flags;
#if defined(O_NONBLOCK)
if(-1 == (flags = fcntl(fd, F_GETFL,0)))
flags = 0;
return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
#else
flags = 1;
return ioctl(fd, FIOBIO, &flags);
#endif
}