From 46901ff78cce3cedea4ba0c38126b5e50b87faa8 Mon Sep 17 00:00:00 2001 From: Kolan Sh <mecareful@gmail.com> Date: Mon, 2 May 2011 19:21:54 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c/masync_server/Makefile | 2 +- c/masync_server/echo-client.c | 3 ++ c/masync_server/echo-server.c | 86 ++++++++++------------------------- 3 files changed, 28 insertions(+), 63 deletions(-) diff --git a/c/masync_server/Makefile b/c/masync_server/Makefile index 14147cb..969bee0 100644 --- a/c/masync_server/Makefile +++ b/c/masync_server/Makefile @@ -5,7 +5,7 @@ OBJECTS=$(SOURCES:%.c=%.o) #CFLAGS=-march=core2 -mtune=core2 -O2 -mfpmath=sse -msse4.1 -pipe #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 all: $(TARGET) echo-server echo-client diff --git a/c/masync_server/echo-client.c b/c/masync_server/echo-client.c index ba6cc05..5bbcec8 100644 --- a/c/masync_server/echo-client.c +++ b/c/masync_server/echo-client.c @@ -48,6 +48,9 @@ int main() } send(sock, message, sizeof(message), 0); + + memset(buf, sizeof(message), 0); + recv(sock, buf, sizeof(message), 0); printf("%s\n", buf); diff --git a/c/masync_server/echo-server.c b/c/masync_server/echo-server.c index 7837ad7..d404bb9 100644 --- a/c/masync_server/echo-server.c +++ b/c/masync_server/echo-server.c @@ -14,9 +14,9 @@ #include "xerror.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) { @@ -138,14 +138,8 @@ void *serv_request(void *data) if (FD_ISSET(listenSocket, &readFdSet)) { while (1) { - - /* - Вызовы pthread_mutex_lock, pthread_mutex_unlock - Не нужны в среде Linux - */ - pthread_mutex_lock(&request_mutex); int result = accept(listenSocket, (struct sockaddr *)NULL, NULL); - pthread_mutex_unlock(&request_mutex); + if (result < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) break; @@ -169,33 +163,46 @@ void *serv_request(void *data) } } +/* + * Установка слушающего сокета на порту port + */ int getServerSocket(unsigned short int port) { int listenSocket; struct sockaddr_in listenSockaddr; + // создание сокета if ((listenSocket = socket(PF_INET, SOCK_STREAM, 0)) < 0) die("socket()", errno); + + // задание адреса сокета и его параметров memset(&listenSockaddr, 0, sizeof(listenSockaddr)); listenSockaddr.sin_family = PF_INET; listenSockaddr.sin_port = htons(port); listenSockaddr.sin_addr.s_addr = INADDR_ANY; + // привязка сокета listenSocket к адресу listenSockaddr if (bind(listenSocket, (struct sockaddr *)&listenSockaddr, sizeof(listenSockaddr)) < 0) die("bind()", errno); - if (listen(listenSocket, 5) < 0) + // установка очереди входящих соединений в MAX_CONNECTIONS + if (listen(listenSocket, MAX_CONNECTIONS) < 0) die("listen()", errno); return listenSocket; } +/* + * Основная процедура создания слушающего сокета + * и нитей, обрабатывающих входящие соединения + */ int main(int argc, char *argv[]) { int k; int descSock; - char *service = "1500"; + char *service = "3425"; + // порт в argv[1] switch (argc) { case 1: break; @@ -207,75 +214,30 @@ int main(int argc, char *argv[]) exit(1); } + // NUM_THREADS нитей pthread_t p_thread[NUM_THREADS]; pthread_attr_t attr; + // инициализация аттрибутов нитей pthread_attr_init(&attr); size_t stacksize = 512; pthread_attr_setstacksize(&attr, stacksize); pthread_attr_getstacksize(&attr, &stacksize); + // создание слушающего сокета descSock = getServerSocket(atoi(service)); + // создание NUM_THREADS нитей for (k = 0; k < NUM_THREADS; k++) { pthread_create(&p_thread[k], &attr, serv_request, (void *)&descSock); printf("Thread %d started\n", k); } + // уничтожение объекта атрибутов pthread_attr_destroy(&attr); + // ожидание завершения работы нитей for (k = 0; k < NUM_THREADS; k++) { pthread_join(p_thread[k], NULL); 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; -//~ }