2010-12-07 176 views
1

我有個問題與在多線程環境中的客戶端 - 服務器的程序來實現客戶機 - 服務器的多線程程序的情況下如下:客戶端發送4個字符串,通過由作爲處理服務器中創建的管通過命令行傳遞如下方式:通過命名管道

@./server -p <named_pipe> -t <threads_numbers> 
e.g @./server -p Pipea -t 15 

服務器創建一個管道收聽客戶端請求和多個線程,將作爲許多請求的如可以由叔指定(它使用getopt的功能。)

問題是我不知道,我甚至不能,服務器聽取getopt的規定請求數,即只能聽到來自單個客戶端程序的請求並完成。

這裏是我的代碼,客戶端程序:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
int f, g,pipe_id; 
char pipe [250]; 
FILE *entrada; 
char temp [500]; 
char comando [500]; 
char maquina [500]; 
char dir_ip [500]; 
//char *comando, *maquina, *dir_ip; 

printf("@>"); 
    scanf ("%s %s %s", comando, maquina, dir_ip); 


//take the pid of p. client to create the pipe 
sprintf(pipe, "%d", getpid()); 

// Pipe created by the pipe client process will name the client process PID. 
if((mkfifo(pipe,0666))==-1) 
{ 
perror("error creando tuberia"); 
exit(1); 
} 


//This file contains the last name of the server process for the pipe 
entrada = fopen("tubo.txt", "r"); 
fscanf (entrada, "%s\n",temp); 


if((f=open(temp ,O_WRONLY | O_CREAT | O_TRUNC, 0644))==-1) 
{ 
perror("error abriendo tuberia"); 
exit(1); 
} 

write (f, pipe, 300); 
write(f,comando,300); 
write(f,maquina,300); 
write(f,dir_ip,300); 

close (f); 

wait(1); 

char * a =(char *) malloc (sizeof(char)*5);//flAg 

if((g=open(pipe,O_RDONLY))==-1) 
{ 
perror("error creating pipe"); 
exit(1); 
} 


read(g,a,300); //read the feedback form server 

printf ("feedback server: %s\n", a); 

return (0); 
} 

這裏是我的代碼到服務器:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <pthread.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 

#define NUM_THREADS 10 

struct thread_data{ 
char *pipe_id; 
char *comando; 
char *maquina; 
char *ip; 
}; 

struct thread_data thread_data_array[NUM_THREADS]; 

//function thread 
void *solicitud(void *threadarg) { 

int j, g, cont; 
char *pipe, *com, *maq, *dir_ip; 
char *maquina, *direccion; 
char flag [15]= "OK"; 
struct thread_data *my_data; 

my_data = (struct thread_data *) threadarg; 
pipe = my_data->pipe_id; 
com = my_data->comando; 
maq = my_data->maquina; 
dir_ip = my_data->ip; 
printf("pipe id %s: command:%s machine:%s ip_address:%s\n", pipe, com, maq, dir_ip); 

j= atoi (pipe); 
if((j=open(pipe,O_WRONLY))==-1) 
    { 
    perror("error opning pipe"); 
    exit(1); 
    } 
    write (j, flag, 300); 
    close(j); 

pthread_exit(NULL); 

} 


int main (int argc, char *argv []){ 

FILE *entrada, *salida; 

char *aux; 
char busq [200]; 
char *PipeName = NULL; //nombre del pipe 
int index; //non-option 
int NumberThreads = 0; 
int c; //getoopt 
int f; 
int rc, t=0; 
pthread_t threads[NUM_THREADS]; 
char * a =(char *) malloc (sizeof(char)*300); 
char * b =(char *) malloc (sizeof(char)*300); 
char * d =(char *) malloc (sizeof(char)*300); 
char * pid_ =(char *) malloc (sizeof(char)*300); 

opterr = 0; 

while ((c = getopt (argc, argv, "p:t:")) != -1) 

switch (c) 
{ 
    case 't': 
    NumberThreads = atoi(optarg); 

    break; 
    case 'p': 
    PipeName = optarg; 

      break; 
    case '?': 
    if ((optopt == 'p')||(optopt=='t')) 
    fprintf (stderr, "Opcion -%c Needs Argument.\n", optopt); 
    else if (isprint (optopt)) 
    fprintf (stderr, "Unknow Option `-%c'.\n", optopt); 
    else 
    fprintf (stderr,"unknow answer...`\\x%x'.\n",optopt); 


    return 1; 

    default: 
    abort(); 
} 

     printf ("Slaves Threads= %d, PipeName = %s\n",NumberThreads, PipeName); 

for (index = optind; index < argc; index++) 
printf ("Non-option argument %s\n", argv[index]); 

//array of threads 
pthread_t mythreads [NumberThreads]; 


if((mkfifo(PipeName,0666))==-1) 
{ 
perror("error creating pipe"); 
exit(1); 
} 


salida = fopen("tubo.txt", "w"); 
fprintf(salida,"%s\n", PipeName); 
fclose (salida); 

if((f=open(PipeName,O_RDONLY | O_CREAT | O_TRUNC, 0644))==-1) 
{ 
    perror("error creating pipe"); 
    exit(1); 
} 


for (;;){ 

read(f, pid_, 300);/
read(f,a,300); 
read(f,b,300); 
read (f,d,300); 
close(f); 

in the commented code try to make the server listen to as many requests as may be specified by the command line didnt work 


    thread_data_array[t].pipe_id = pid_; 
    thread_data_array[t].comando = a; 
    thread_data_array[t].maquina = b; 
    thread_data_array[t].ip = d; 


    rc = pthread_create(&threads[t], NULL, solicitud, 
    (void *) &thread_data_array[t]); 

    if (rc) 
    { 
    printf("ERR; pthread_create() ret = %d\n", rc); 
    exit(-1); 
    } 
t++; 

if (t==NumberThread){ 
    break; 
    } 

}//end loop 

pthread_exit(NULL); 


return 0; 
} 

很抱歉,如果這個問題是相當愚蠢的,我是新來的這門語言..謝謝你所有的幫助和原諒我的英語,修復一些代碼,我需要有人真正幫助我。感謝所有

回答

2

它看起來像你正在做的read()的主(內部調用),而不是線程函數裏面。由於read()調用將被阻塞,因此它們需要在單獨的線程中完成,否則(如您所見),您的主線程將阻塞等待單個客戶端,並且無法並行處理其他客戶端。

+0

是主要的讀數,所以它可以通過結構發送到線程函數嗎? – franvergara66 2010-12-08 00:15:23