комменты

This commit is contained in:
Kolan Sh 2011-05-02 19:21:54 +04:00
parent c6b11b3c61
commit 46901ff78c
3 changed files with 28 additions and 63 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;
//~ }