комменты
This commit is contained in:
parent
c6b11b3c61
commit
46901ff78c
|
@ -5,7 +5,7 @@ OBJECTS=$(SOURCES:%.c=%.o)
|
||||||
#CFLAGS=-march=core2 -mtune=core2 -O2 -mfpmath=sse -msse4.1 -pipe
|
#CFLAGS=-march=core2 -mtune=core2 -O2 -mfpmath=sse -msse4.1 -pipe
|
||||||
#LDFLAGS=-Wl,-O1 -Wl,--as-needed
|
#LDFLAGS=-Wl,-O1 -Wl,--as-needed
|
||||||
|
|
||||||
CFLAGS+=$(shell pkg-config --cflags liblist)
|
CFLAGS+= -g $(shell pkg-config --cflags liblist)
|
||||||
LDFLAGS+=$(shell pkg-config --libs liblist) -lpthread
|
LDFLAGS+=$(shell pkg-config --libs liblist) -lpthread
|
||||||
|
|
||||||
all: $(TARGET) echo-server echo-client
|
all: $(TARGET) echo-server echo-client
|
||||||
|
|
|
@ -48,6 +48,9 @@ int main()
|
||||||
}
|
}
|
||||||
|
|
||||||
send(sock, message, sizeof(message), 0);
|
send(sock, message, sizeof(message), 0);
|
||||||
|
|
||||||
|
memset(buf, sizeof(message), 0);
|
||||||
|
|
||||||
recv(sock, buf, sizeof(message), 0);
|
recv(sock, buf, sizeof(message), 0);
|
||||||
|
|
||||||
printf("%s\n", buf);
|
printf("%s\n", buf);
|
||||||
|
|
|
@ -14,9 +14,9 @@
|
||||||
#include "xerror.h"
|
#include "xerror.h"
|
||||||
#include "netfuncs.h"
|
#include "netfuncs.h"
|
||||||
|
|
||||||
#define NUM_THREADS 8
|
#define NUM_THREADS 1
|
||||||
|
#define MAX_CONNECTIONS 1
|
||||||
|
|
||||||
pthread_mutex_t request_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
void *serv_request(void *data)
|
void *serv_request(void *data)
|
||||||
{
|
{
|
||||||
|
@ -138,14 +138,8 @@ void *serv_request(void *data)
|
||||||
if (FD_ISSET(listenSocket, &readFdSet)) {
|
if (FD_ISSET(listenSocket, &readFdSet)) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
/*
|
|
||||||
Вызовы pthread_mutex_lock, pthread_mutex_unlock
|
|
||||||
Не нужны в среде Linux
|
|
||||||
*/
|
|
||||||
pthread_mutex_lock(&request_mutex);
|
|
||||||
int result = accept(listenSocket, (struct sockaddr *)NULL, NULL);
|
int result = accept(listenSocket, (struct sockaddr *)NULL, NULL);
|
||||||
pthread_mutex_unlock(&request_mutex);
|
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||||
break;
|
break;
|
||||||
|
@ -169,33 +163,46 @@ void *serv_request(void *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Установка слушающего сокета на порту port
|
||||||
|
*/
|
||||||
int getServerSocket(unsigned short int port)
|
int getServerSocket(unsigned short int port)
|
||||||
{
|
{
|
||||||
int listenSocket;
|
int listenSocket;
|
||||||
struct sockaddr_in listenSockaddr;
|
struct sockaddr_in listenSockaddr;
|
||||||
|
|
||||||
|
// создание сокета
|
||||||
if ((listenSocket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
|
if ((listenSocket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
|
||||||
die("socket()", errno);
|
die("socket()", errno);
|
||||||
|
|
||||||
|
// задание адреса сокета и его параметров
|
||||||
memset(&listenSockaddr, 0, sizeof(listenSockaddr));
|
memset(&listenSockaddr, 0, sizeof(listenSockaddr));
|
||||||
listenSockaddr.sin_family = PF_INET;
|
listenSockaddr.sin_family = PF_INET;
|
||||||
listenSockaddr.sin_port = htons(port);
|
listenSockaddr.sin_port = htons(port);
|
||||||
listenSockaddr.sin_addr.s_addr = INADDR_ANY;
|
listenSockaddr.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
|
// привязка сокета listenSocket к адресу listenSockaddr
|
||||||
if (bind(listenSocket, (struct sockaddr *)&listenSockaddr, sizeof(listenSockaddr)) < 0)
|
if (bind(listenSocket, (struct sockaddr *)&listenSockaddr, sizeof(listenSockaddr)) < 0)
|
||||||
die("bind()", errno);
|
die("bind()", errno);
|
||||||
|
|
||||||
if (listen(listenSocket, 5) < 0)
|
// установка очереди входящих соединений в MAX_CONNECTIONS
|
||||||
|
if (listen(listenSocket, MAX_CONNECTIONS) < 0)
|
||||||
die("listen()", errno);
|
die("listen()", errno);
|
||||||
|
|
||||||
return listenSocket;
|
return listenSocket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Основная процедура создания слушающего сокета
|
||||||
|
* и нитей, обрабатывающих входящие соединения
|
||||||
|
*/
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int k;
|
int k;
|
||||||
int descSock;
|
int descSock;
|
||||||
char *service = "1500";
|
char *service = "3425";
|
||||||
|
|
||||||
|
// порт в argv[1]
|
||||||
switch (argc) {
|
switch (argc) {
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
|
@ -207,75 +214,30 @@ int main(int argc, char *argv[])
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NUM_THREADS нитей
|
||||||
pthread_t p_thread[NUM_THREADS];
|
pthread_t p_thread[NUM_THREADS];
|
||||||
pthread_attr_t attr;
|
pthread_attr_t attr;
|
||||||
|
// инициализация аттрибутов нитей
|
||||||
pthread_attr_init(&attr);
|
pthread_attr_init(&attr);
|
||||||
size_t stacksize = 512;
|
size_t stacksize = 512;
|
||||||
pthread_attr_setstacksize(&attr, stacksize);
|
pthread_attr_setstacksize(&attr, stacksize);
|
||||||
pthread_attr_getstacksize(&attr, &stacksize);
|
pthread_attr_getstacksize(&attr, &stacksize);
|
||||||
|
|
||||||
|
// создание слушающего сокета
|
||||||
descSock = getServerSocket(atoi(service));
|
descSock = getServerSocket(atoi(service));
|
||||||
|
|
||||||
|
// создание NUM_THREADS нитей
|
||||||
for (k = 0; k < NUM_THREADS; k++) {
|
for (k = 0; k < NUM_THREADS; k++) {
|
||||||
pthread_create(&p_thread[k], &attr, serv_request, (void *)&descSock);
|
pthread_create(&p_thread[k], &attr, serv_request, (void *)&descSock);
|
||||||
printf("Thread %d started\n", k);
|
printf("Thread %d started\n", k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// уничтожение объекта атрибутов
|
||||||
pthread_attr_destroy(&attr);
|
pthread_attr_destroy(&attr);
|
||||||
|
|
||||||
|
// ожидание завершения работы нитей
|
||||||
for (k = 0; k < NUM_THREADS; k++) {
|
for (k = 0; k < NUM_THREADS; k++) {
|
||||||
pthread_join(p_thread[k], NULL);
|
pthread_join(p_thread[k], NULL);
|
||||||
printf("Completed join with thread %d\n", k);
|
printf("Completed join with thread %d\n", k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//~ int tmp()
|
|
||||||
//~ {
|
|
||||||
//~ int sock, listener;
|
|
||||||
//~ struct sockaddr_in addr;
|
|
||||||
//~ char buf[1024];
|
|
||||||
//~ int bytes_read;
|
|
||||||
//~
|
|
||||||
//~ listener = socket(AF_INET, SOCK_STREAM, 0);
|
|
||||||
//~ if(listener < 0)
|
|
||||||
//~ {
|
|
||||||
//~ perror("socket");
|
|
||||||
//~ exit(1);
|
|
||||||
//~ }
|
|
||||||
//~
|
|
||||||
//~ addr.sin_family = AF_INET;
|
|
||||||
//~ addr.sin_port = htons(3425);
|
|
||||||
//~ addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
//~ if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
|
|
||||||
//~ {
|
|
||||||
//~ perror("bind");
|
|
||||||
//~ exit(2);
|
|
||||||
//~ }
|
|
||||||
//~
|
|
||||||
//~ listen(listener, 1);
|
|
||||||
//~ //printf("%X\n",addr.sin_addr.s_addr);
|
|
||||||
//~ while(1)
|
|
||||||
//~ {
|
|
||||||
//~ socklen_t n = sizeof(struct sockaddr);
|
|
||||||
//~ sock = accept(listener, (struct sockaddr *)&addr, &n);
|
|
||||||
//~ printf("incoming request from %s\n",int2ip(ntohl(addr.sin_addr.s_addr)));
|
|
||||||
//~ //printf("%X\n",addr.sin_addr.s_addr);
|
|
||||||
//~ if(sock < 0)
|
|
||||||
//~ {
|
|
||||||
//~ perror("accept");
|
|
||||||
//~ exit(3);
|
|
||||||
//~ }
|
|
||||||
//~
|
|
||||||
//~ while(1)
|
|
||||||
//~ {
|
|
||||||
//~ bytes_read = recv(sock, buf, 1024, 0);
|
|
||||||
//~ if(bytes_read <= 0) break;
|
|
||||||
//~ send(sock, buf, bytes_read, 0);
|
|
||||||
//~ printf("%s", buf);
|
|
||||||
//~ }
|
|
||||||
//~
|
|
||||||
//~ close(sock);
|
|
||||||
//~ }
|
|
||||||
//~
|
|
||||||
//~ return 0;
|
|
||||||
//~ }
|
|
||||||
|
|
Loading…
Reference in New Issue