【问题标题】:I Can't close the socket connection between the server and the client我无法关闭服务器和客户端之间的套接字连接
【发布时间】:2014-05-12 16:36:40
【问题描述】:

当我尝试关闭来自客户端的连接时遇到问题,我想在客户端写入“q”之类的字符串时关闭与服务器的连接,并且我在来自客户端的消息之后执行 strcmp由服务器读取,但由于未通过比较而无法正常工作。

这是服务器的代码

    while(1){

    if((n = read(newsocketfd,buffer,sizeof(buffer))) > 0)
            printf("(Mlength %d) message from Client:  %s\n",n,buffer);
    else{

        close(socketfd);
        close(newsocketfd);
        error("Error reading message \n");
    }

    if(strcmp("q",&buffer[n]) == 0)
        printf("El cliente intenta cerrar la conexión %s\n",&buffer[n]);
    else
        printf("Se recibieron datos desde el cliente %s\n",&buffer[n]);

    if(write(newsocketfd,response,255) > 0)
            printf("Writing response to Client socket \n");
    else
            error("Error writing message \n");
    }

return EXIT_SUCCESS;

}

这是客户端的代码

   do{
printf("Please, type your message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

n = write(socketfd,buffer,sizeof(buffer));
if(n < 0 )
    error("Error writing to socket \n");
else
    printf("...Message sent \n");

n = read(socketfd,buffer,sizeof(buffer));
if(n < 0 )
        error("Error writing to socket \n");
    else
        printf("\n Message from server: %s \n",buffer);

}while(strcmp("q",buffer)!=0);

【问题讨论】:

  • 好吧,假设缓冲区是一个可以用 printf("%s..) 安全打印的以 null 结尾的字符串,这会招致灾难,然后您尝试将 "q" 与未定义的字符串进行比较在已读取的缓冲区部分之后的字符:'&buffer[n]'。检查所有服务器和客户端代码是否存在无效假设 - 接收到的数据保证为空终止,并且 TCP 传输的消息长度超过一个字节 - 它不,它只传输八位字节/字节流,并且通常需要多次读取调用才能传输应用程序级协议单元。
  • 网络编程有几个陷阱,你必须在开始之前了解这些陷阱。我建议在进一步学习之前阅读一本关于网络编程的书籍。否则你会经常遇到一些看起来不直观的事情。

标签: c string sockets


【解决方案1】:
read(newsocketfd, buffer, sizeof(buffer)))

缓冲区溢出-----------^

if ((n = read(newsocketfd, buffer, sizeof(buffer) - 1)) > 0) { /* Note -1 */
    buffer[n] = '\0'; /* read() doesn't add a trailing 0 */
    printf("(Mlength %d) message from Client:  %s\n",n,buffer);
} else {
    ...

if (strcmp("q", &buffer[n]) == 0) /* you are reading NUL ('\0') */

改为:

if (strcmp("q", buffer) == 0)

【讨论】:

  • 似乎缓冲区永远不会只有 char q ,它总是有 n+1 个字符,因为验证不起作用,请你给我建议关闭两个程序之间的联系?
  • 您是否尝试过使用sizeof(buffer) - 1strlen(buffer)? (write() 也一样)
  • 检查 strlen 工作正常并且连接已关闭,但我想指定一个类似 ("quit") 的字符串来关闭连接
猜你喜欢
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 2014-05-21
相关资源
最近更新 更多