Tôi đang cố gắng viết các chương trình C máy khách và máy khách đơn giản, giao tiếp với nhau trong các đầu cuối riêng biệt.Kết nối máy khách-máy chủ FIFO thích hợp
Máy chủ phải tạo công khai năm mươi và chờ khách hàng. Trong khi đó khách hàng đang tạo ra FIFO của riêng mình thông qua phản hồi của máy chủ sẽ đến. Nhiệm vụ của máy khách gửi cho máy chủ một tên được tạo bởi hàng đợi và lấy lại kết quả của lệnh ls
.
Tôi đã tìm kiếm câu trả lời, ví dụ: fifo-server-program, example-of-using-named-pipes-in-linux-bash, how-to-send-a-simple-string-between-two-programs-using-pipes. Tôi bắt đầu với mã từ liên kết thứ ba và từ từ sửa đổi nó.
Điều tôi hiện có, là một ứng dụng khách lấy dữ liệu đầu vào từ người dùng, gửi nó đến máy chủ và nhận lại. Nhưng nó chỉ hoạt động một lần. Tôi không biết tại sao. Phần thân của hàm chính bên dưới. Tôi sẽ biết ơn vì sự giúp đỡ nào.
EDIT: Tôi hiểu nó hoạt động! : D Các mã dưới đây, có thể nó sẽ giúp một ai đó.
Mã server.c:
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char* argv[])
{
int fds[2];
char tab[BUFSIZ];
int fd, n;
char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";
pipe(fds);
mkfifo(myfifo,0666);
while(1)
{
fds[0]=open(myfifo2,O_RDONLY);
fds[1]=open(myfifo,O_WRONLY);
read(fds[0],tab,BUFSIZ);
if (strcmp("klient",tab)==0) {
printf("Od klienta: %s\n",tab);
fd=open(tab,O_WRONLY);
if(fork()==0)
{
dup2(fds[1],1);
close(fds[1]);
execlp("ls","ls","-l",NULL);
close(fds[0]);
close(fds[1]);
}
else
{
dup2(fds[0],0);
n = read(fds[0],tab,BUFSIZ);
write(fd,tab,n);
close(fds[0]);
close(fds[1]);
}
}
memset(tab, 0, sizeof(tab));
close(fd);
close(fds[0]);
close(fds[1]);
}
unlink(myfifo);
return 0;
}
Mã client.c:
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char* argv[])
{
int fds[2];
char *myfifo = "/tmp/serwer";
char *myfifo2 = "/tmp/client";
mkfifo(myfifo2,0666);
fds[0]=open(myfifo,O_RDONLY);
fds[1]=open(myfifo2,O_WRONLY);
char tab[BUFSIZ];
memset(tab, 0, sizeof(tab));
write(fds[1],"klient",6);
perror("Write:"); //Very crude error check
read(fds[0],tab,sizeof(tab));
perror("Read:"); // Very crude error check
printf("Odebrano od serwera: %s\n",tab);
close(fds[0]);
close(fds[1]);
unlink(myfifo2);
return 0;
}
Không rõ ràng từ mã này. Bạn đã nhận được đầu ra ls làm việc hay bạn chỉ gửi tin nhắn nhỏ? Lỗ hổng thông thường trong trường hợp này là bạn bế tắc tức là máy chủ đang đợi đầu vào trong khi máy khách đang đợi đầu vào. Họ chờ đợi mãi mãi bởi vì không ai gửi bất cứ điều gì. – Duck
Không, lệnh ls vẫn chưa hoạt động. Các chương trình này hoạt động một lần - máy chủ đợi một tin nhắn, trả về cho máy khách, máy khách có thể đóng. Khi tôi muốn gửi một tin nhắn khác, cả máy khách và máy chủ đều không phản hồi. – uluroki