c++ - 读/写 : Illegal seek - client-server C++

标签 c++ c client-server pipe named-pipes

我在 stackoverflow 上找到了客户端-服务器代码(使用命名管道),我对其进行了修改,让客户端在 while 循环中发送消息。虽然我从服务器收到消息,但我在读/写时收到“非法搜索”,我不确定这是否是一个严重的错误,如果这里真的很糟糕?

server.cpp

#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.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 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.\n");

   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;
}

客户端.cpp

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.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];


   //printf("Input message to serwer: ");
   //scanf("%s", str);


   /* write str to the FIFO */
   client_to_server = open(myfifo, O_WRONLY);
   server_to_client = open(myfifo2, O_RDONLY);

while(true)
{

   printf("> "); 
   scanf("%s", str);
   write(client_to_server, str, sizeof(str));

   perror("Write:"); //Very crude error check

   read(server_to_client,str,sizeof(str));

   perror("Read:"); // Very crude error check

   printf("From  server: %s\n",str);
}
   close(client_to_server);
   close(server_to_client);

   /* remove the FIFO */

   return 0;
}

示例输出:

客户端:

> hello, server!
Write:: Success
Read:: Illegal seek
From  server: hello,
Write:: Illegal seek
Read:: Illegal seek
> From  server: server!
> its client here!
Write:: Illegal seek
Read:: Illegal seek
From  server: its
Write:: Illegal seek
Read:: Illegal seek
> From  server: client
Write:: Illegal seek
Read:: Illegal seek
> From  server: here!
> > hello, server!
// and so on ...

服务器:

Server ON.
Received: hello,
Sending back...
Received: server!
Sending back...
Received: its
Sending back...
Received: client
Sending back...
Received: here!
Sending back...
Received: >
Sending back...
Received: hello,
Sending back...
Received: server!
Sending back...
Received: Write::
Sending back...
Received: Success
Sending back...
Received: Read::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: From
Sending back...
Received: server:
Sending back...
Received: hello,
Sending back...
Received: Write::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: Read::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: >
Sending back...
Received: From
Sending back...
Received: server:
Sending back...
Received: server!
Sending back...
Received: >
Sending back...
Received: its
Sending back...
Received: client
Sending back...
Received: here!
Sending back...
Received: Write::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: Read::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: From
Sending back...
Received: server:
Sending back...
Received: its
Sending back...
Received: Write::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: Read::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: >
Sending back...
Received: From
Sending back...
Received: server:
Sending back...
Received: client
Sending back...
Received: Write::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: Read::
Sending back...
Received: Illegal
Sending back...
Received: seek
Sending back...
Received: >
Sending back...
Received: From
Sending back...
Received: server:
Sending back...
Received: here!
Sending back...
Received: >
Sending back...

最佳答案

如果没有错误,不要调用 perror

在调用 perror 之前,您需要检查前一个函数调用是否失败,否则当实际上没有错误发生时,您将收到无意义的错误消息。如果函数没有失败,(通常)不需要将 errno 设置为任何特定的值。

关于c++ - 读/写 : Illegal seek - client-server C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670364/

相关文章:

c++ - 如何在 makefile 指令中包含 C 和 C++ 文件

c++ - 通用成员函数定义

c++ - C++17 中的部分类模板参数推导

C 运行时错误 #3

c - 通过在堆上分配与在堆栈上分配创建的指针之间的差异

ruby-on-rails - 如何在S3中存储数据并允许用户使用rails API/iOS客户端以安全的方式访问?

java - 实现客户端-服务器,GUI StringBuilder 问题

javascript - 从服务器获取数据到客户端,无需刷新页面

c++ - C++ 命名空间后的类名

c++ - 如何使用 C++ 和 CMake 在 Windows 上进行开发