У меня есть программа клиент/сервер.
Клиент делает следующее в цикле.
- записывает string1 в канал.
- прочитать строку из другого канала.
- записывает string2 в канал.
Сервер делает следующее в цикле.
- читает строку.
- записывает те же данные клиенту на другом канале.
Для некоторых итераций это работает нормально, примерно после 10 итераций только строка2 читается как на клиенте, так и на сервере. Почему это так? Кроме того, в клиентской программе в цикле while(), если read() вызывается после 2-го write(), все работает нормально.
В клиенте со второй итерации read() должен возвращать все данные в канале, потому что канал не имеет границ сообщения. Но он просто читает только данные, записанные 1 вызовом write() на сервере.
Ниже приведен мой код для справки.
server.c
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
int main()
{
client_to_server;
char *myfifo = "/tmp/client_to_server_fifo";
int server_to_client;
char *myfifo2 = "/tmp/server_to_client_fifo";
char buf[BUFSIZ];
/* create the FIFO (named pipe) */
mkfifo(myfifo, 0666);
mkfifo(myfifo2, 0666);
/* open, read, and display the message from the FIFO */
client_to_server = open(myfifo, O_RDONLY);
server_to_client = open(myfifo2, O_WRONLY);
printf("Server ON bufsize=%d.\n", BUFSIZ);
while (1)
{
read(client_to_server, buf, BUFSIZ);
if (strcmp("exit",buf)==0)
{
printf("Server OFF.\n");
break;
}
else if (strcmp("",buf)!=0)
{
printf("Received: %s\n", buf);
printf("Sending back...\n");
write(server_to_client,buf,BUFSIZ);
}
/* clean buf from any data */
memset(buf, 0, sizeof(buf));
}
close(client_to_server);
close(server_to_client);
unlink(myfifo);
unlink(myfifo2);
return 0;
}
клиент.c
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include<string.h>
int main()
{
int client_to_server;
char *myfifo = "/tmp/client_to_server_fifo";
int server_to_client;
char *myfifo2 = "/tmp/server_to_client_fifo";
char str[BUFSIZ];
/* write str to the FIFO */
client_to_server = open(myfifo, O_WRONLY);
server_to_client = open(myfifo2, O_RDONLY);
char buf1[30] = "str1";
char buf2[30] = "str2";
while(1){
//write first string
write(client_to_server, buf1, sizeof(buf1));
read(server_to_client,str,sizeof(str));
perror("Read:"); // Very crude error check
printf("...received from the server: %s\n",str);
memset(str, '\0', sizeof(str));
//write second string
write(client_to_server, buf2, sizeof(buf2));
}
close(client_to_server);
close(server_to_client);
return 0;
}
Ниже приведен вывод: Вывод сервера: Сервер ON bufsize=8192. Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка назад... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно... Получено: str2 Отправка обратно... Получено: str1 Отправка обратно. .. Получено: str2 Возвращается... Получено: str2 Возвращается... Получено: str2 Возвращается... Получено: str2 Возвращается... Получено: str2 Возвращается... Получено: str2 Возвращается... Получено: str2 Отправка обратно... Получено: str2
Ниже приведен вывод клиента: ...получено от сервера: str1 ...получено от сервера: str2 ...получено от сервера: str1 ...получено от сервера: str2 ...получено от сервера : str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ... получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str1 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено отсюда m сервер: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2 ...получено с сервера: str2
sizeof
здесьwrite(client_to_server, buf1, sizeof(buf1));
, поскольку потенциально вы отправляете str1 и null плюс еще 25 символов? - person lundman   schedule 21.07.2017read()
иwrite()
сработали? - person Andrew Henle   schedule 21.07.2017read(2)
, которое может быть меньшеBUFSIZ
. Кроме того, вам нужно количество байтов, прочитанных в коде сервера, чтобы записать только эти байты. То, как вы это делаете, очень подвержено ошибкам, поскольку вы не проверяете ошибки, исходящие от системных вызовов, которые вы делаете. - person Luis Colorado   schedule 24.07.2017