【问题标题】:Error in sending message from server to client从服务器向客户端发送消息时出错
【发布时间】:2012-10-02 07:37:12
【问题描述】:

我在套接字编程中为计算引擎编写了一个服务器程序,它显示客户端给出的数字的平均值。 我的客户代码:

main()
{
    //socket
    //connect
    gets(msg);
    f=sscanf(msg,"%f",&num);
    write(sockfd,msg,strlen(msg));
    while ((n1=read(sockfd,result,Z))>0) {
        write(1,result,n1);
    }
}

在服务器中:

while((rfd=read(sockfd,buff,Z))>0) {
    sscanf(buff,"%f",&num);
    sum=sum+num;
}
sum=sum/n;
snprintf(res,Z,"%f",sum);
write(sockfd,res,strlen(res));

程序不工作。如果我删除服务器中的写入,那么它正在工作。 如果我只是从服务器向客户端发送一个示例消息,删除所有计算,那么它就可以工作。 谁能告诉我是什么错误

【问题讨论】:

  • 一个问题是您没有终止收到的字符串。发送strlen(...) + 1 字节或显式终止您收到的字符串。
  • 当客户端发送完号码后,服务器中的read() 将被阻塞。即,它不会返回。 read() 只会在套接字关闭后返回。因此,您的客户端应该先发制人地告诉服务器需要多少数字。
  • 客户端程序必须接受输入,直到用户提供--。所以我正在检查那个条件。

标签: c sockets tcp


【解决方案1】:
  1. 协议错误。客户端正在写入一个数字,但服务器正在读取无限数量的数字。您需要 (a) 将服务器更改为读取一次,(b) 提前发送要读取的数字数量,或者 (c) 在写入数字之后和读取响应之前关闭客户端套接字以进行输出。

  2. 您在另一个方向上遇到了类似的协议错误。服务器正在写一个响应,但客户端一直在循环。服务器必须在写完回复后关闭套接字。

  3. 需要在服务器的read()后面加上`buff[rfd] = 0',否则sscanf不知道停在哪里。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多