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;
}
很抱歉,如果這個問題是相當愚蠢的,我是新來的這門語言..謝謝你所有的幫助和原諒我的英語,修復一些代碼,我需要有人真正幫助我。感謝所有
是主要的讀數,所以它可以通過結構發送到線程函數嗎? – franvergara66 2010-12-08 00:15:23