gpt4 book ai didi

通过命名管道实现的客户端-服务器多线程程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:27 25 4
gpt4 key购买 nike

我在多线程环境中遇到客户端-服务器程序的问题,案例如下:客户端通过进程​​服务器创建的管道发送 4 个字符串,该管道通过命令行传递,方式如下:

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

服务器创建一个管道来监听客户端请求和一些线程,这些线程将服务于 -t 指定的尽可能多的请求(它使用 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;
}

如果这个问题很愚蠢,我很抱歉,我是这种语言的新手..谢谢大家的帮助,请原谅我的英语,修复一些代码,我需要有人帮助我解决这个问题。感谢大家

最佳答案

看起来您是在 main() 内部执行 read() 调用,而不是在线程函数内部。由于 read() 调用会阻塞,因此它们需要在单独的线程中完成,否则(如您所见)您的主线程将阻塞等待单个客户端,并且无法并行服务其他客户端。

关于通过命名管道实现的客户端-服务器多线程程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com