UNIX中的套接字编程

阿里·雷曼(Ali Rehman)

我已经写了一个基于服务器/客户端的C程序。该程序的基本功能是,客户端将向服务器发送一个字符,例如,服务器将其递增并将字符发回。因此,如果客户发送“ a”,它将收到“ b”。但是,当客户端发送“ q”时,服务器应该关闭连接。该程序正在执行其应做的工作,但是在客户端将其打印两次“输入字符”和“来自服务器的字符”。同时发送“ q”并会关闭连接,但前提是您第二次发送该连接。

这是服务器端代码

void *client_thread(void *client_sockfd){
    int socket=*(int *)client_sockfd;
    while(1){
        read(socket, &ch, 1);
        if(ch=='q')
        {
            close(socket); 
        }
        else 
        {
            ch++;
            write(socket, &ch, 1);
        }
    }
    //close(socket);
    printf("Connection closed with %d",socket);       

}//end fucntion

客户端代码

while(1)
{
    printf("Enter a character");
    scanf("%c",&ch);  
    write(sockfd, &ch, 1);
    read(sockfd, &ch, 1);
    printf("char from server = %c\n", ch);

    //  close(sockfd);
    //exit(0);
}
if(ch=='q'){
    printf("Server closed the connection");
}
苏比诺

客户端:在此打印两行,因为有两个输入,一个是您的字符,第二个是enter\n

因此scanf("%c%c",&ch);,请在客户端使用。

服务器端:第二个用途while((n = read(sockfd, &ch, 1))>0)是阻止它自动终止连接。read语句返回读取的字节数。

因为您提供的值在获得增量后不会被擦除。原因是:

  • 假设您的输入是a,那么服务器将响应b您,并且您没有在服务器端检查returnread,因此ch每次到达时它都会递增,并且到达q套接字时就会关闭。
  • 当服务器递增该值时,它还会将其发送给客户端,但是由于客户端处于scanf模式下,因此直到该read语句它才能获取输入,因此,您看不到自动递增值。而且增量是如此之快,以至于在您下次输入之前,插座已经被终止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章