如何将一条perror消息写入socket?

时间:2014-01-06 18:00:17

标签: c linux sockets

我有一个客户端和服务器代码。当用户在客户端上键入错误的命令(如run cat)时,服务器会显示exec错误(没有此类文件或目录)。我想将此消息写入sock,以便客户端显示它。

以下是我服务器代码的摘录:

     pd = fork();

       if(pd < 0)
    perror("Fork Error");

       if(pd != 0)
       {
    strcpy(sp[i].pname, param) ;
    sp[i].pdd = pd;
    sp[i].active = 1;
    i++;
    if(sp[i].active==1){
    write(sock, "Done", sizeof("Done"));
    }

       }

     if(pd == 0)
     {
       if(execlp(param, NULL) < 0);
       {
    perror("Exec error: ");
         exit(20);
       }
     }
   }
   else write(sock, "Invalid", sizeof("Invalid"));
   }

1 个答案:

答案 0 :(得分:1)

你有两个相对无痛的选择。

第一个只是使用strerror格式化错误字符串。

    char buffer[200];

    if (execlp(param, NULL) < 0)
    {
        len = snprintf(buffer, sizeof(buffer), "execlp failed %s\n", strerror(errno));

        write(sock, buffer, len);

        // do something
    }

第二个是printf家族的Glibc扩展。 %m字面上确实strerror(errno),你甚至不需要提供errno作为参数。同样的结果,更方便一点。

    if (execlp(param, NULL) < 0)
    {
        int len = snprintf(buffer, sizeof(buffer), "execlp failed %m\n");

        write(sock, buffer, len);

        // do something
    }

请注意,这假设您使用换行符分隔邮件。如果您正在使用其他一些消息方案,则可能必须在消息前面加上其长度或诸如此类的内容。 (并且,与往常一样,套接字读/写应该在循环中完成,以确保传输整个消息。)