键入退出时如何防止我的客户端挂起?

时间:2016-09-21 23:29:48

标签: c sockets client-server telnet kill

我正在尝试实现类似应用程序的telnet,用户可以远程连接到其他人的计算机。我有服务器和客户端代码,但我觉得我的客户端代码是我错的地方。当用户键入“退出”时,我希望我的客户端退出并返回到我的工作目录,但事实并非如此。它无限期地挂起。所以我只发布一些代码而不是发布整个事情,而且我已经删除了一些错误检查,仅仅是为了提问。

pid_t pid = fork();
switch(pid)
{
    case -1: 
        error("Client: Error in forking.\n");
    break;
    case 0: // We are in the child process
    {
        char buffer[BUFFER_SIZE];
        int nread;
        // Read from the terminal/stdin and write to the socket
        while((nread = read(STDIN_FILENO, buffer, BUFFER_SIZE)) > 0)
        {
            int result = write(sockfd, buffer, nread); 
            if(result == -1)
            {
                error("Error while writing to socket\n");
            }
        } // end while
    } // end child

} // end switch

// Parent Read from the socket and write to the terminal/stdout
int nRead;
char buffer[BUFFER_SIZE];
while((nRead = read(sockfd, buffer, 512)) > 0)
{
    int result = write(STDOUT_FILENO, buffer, nRead);
    if(result == -1)
    {
        error("Client: Error while writing to stdout from socket.\n");
    }
} // end while

kill(pid, SIGKILL);
close(sockfd);
// Wait for child to end before the parent
wait(NULL);

所以基本上是在分叉之后,

我的子进程将执行此操作:从terminal / stdin读取并写入套接字。

我的父母会这样做:从套接字读取并写入终端或标准输出。

问题是当我输入exit时,我希望子进程死掉,因为没有其他东西要写入套接字(因为我想关闭与服务器的连接),但是kill语句永远不会被执行。我之前放了一个printf来检查一下。我觉得kill语句之前的while循环是无限的,如果有的话,该怎么做才能阻止它。

0 个答案:

没有答案