繁体   English   中英

UNIX中的套接字编程

[英]socket programming in c unix

我已经写了一个基于服务器/客户端的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");
}

scanf一次读取一个字符,因此,当您键入一个字符并按Enter键时,第一个循环将读取该字符,第二个循环将读取换行符。

您可以使用

scanf("%c%*c", &ch);

读取两个字符,但仅存储第一个字符。

printf("Enter a character");
scanf("%c",&ch); 

实际上,您在此处输入了两个字符,每个按下的键一个,第二个字符来自Enter ,这是换行符/n 这就是为什么其他所有输出

printf("char from server = %c\n", ch);

可能是:

char from server =

然后有一个空行 ,然后是另一个输出。 如果您改为这样做:

printf("char from server = %d\n", (int)ch);
                       //   ^ not %c

在这里强制转换为int并不是真正必要的,但是强调了这个想法。 您现在将获得字符的十进制ASCII值,并且每隔一行将是:

char from server = 10

那是换行符。 有关解决此问题的方法,该方法已使您比以前捕获了无数新生真菌, 请在此处查看我的答案

您的程序正在执行以下操作...

  1. 打印消息“输入字符”并阻止等待STDIN
  2. 用户类型'a'和'\\ n'-scanf()直到换行符才返回控制
  3. 写“ a”,读“ b”,打印“ b”,然后提示“输入字符”
  4. Scanf已经有一个字符(\\ n),因此它立即返回
  5. 写'\\ n',读'\\ n'+ 1,打印'\\ n'+ 1并提示“输入字符”
  6. 从1开始重复。

这就是为什么您两次看到“输入字符”的原因。

至于必须发送两次“ q”,则服务器循环在收到“ q”时不会退出,而是调用close并继续读取。 此后的每次读取都会失败,并立即返回错误代码。 同样,您的客户端循环也不会中断。

捕获并测试您的返回值。 同样,逐步调试器-这将回答您有关C的许多问题,而不必等待论坛作出响应。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM