【问题标题】:Server-client in C: Weird behaviour when sending bytesC中的服务器客户端:发送字节时的奇怪行为
【发布时间】:2015-06-13 17:07:19
【问题描述】:

我正在尝试用 C 编写一个服务器-客户端程序,其中客户端将以 5 个字节的形式发送一堆消息:第一个字节将包含一个命令,接下来的四个将包含一个密钥。它看起来像这样:

rc = write(sockfd, &op, 1);
    if (rc != 1)
    {
        printf("error! write() failed: %s\n", strerror(errno));
        break;
    }

    uint32_t net_num = htonl(num);
    int nsent = 0;
    while (nsent < 4)
    {
        rc = write(sockfd, &net_num + nsent, 4 - nsent);
        if (rc <= 0)
        {
            printf("error! write() failed: %s\n", strerror(errno));
            break;
        }

        nsent += rc;
    }

    if (rc <= 0)
        break;
}

在接收端,我有:

 while((bytes = recv(socket,buffer,5,0)) > 0)
    {
        //printf("%d\t%d\t%d\t%d\t%d\n",(int)buffer[0],(int)buffer[1],      (int)buffer[2],(int)buffer[3],(int)buffer[4]);
        key = ((buffer[4] << 24) | (buffer[3] << 16) | (buffer[2] << 8) | (buffer[1]));

        if((int)buffer[0] == 0)
        {

            do command 0, etc...

我遇到的问题是我无法拿到钥匙。我尝试过切换班次的顺序,但我得到的只是与客户端发送的密钥不匹配的数字。我很茫然。

更奇怪的是,如果我在 while 下编译服务器时没有打印,我会出现 seg-faulted。如果我取消注释 printf,它工作正常。这似乎超级奇怪。

有谁知道这可能是什么原因造成的? 提前致谢。

【问题讨论】:

  • &amp;net_num + nsent, 是错误的,它在 32 位类型上使用指针算术运算。添加前应先转换为 8 位指针类型。
  • 错误:rc = write(sockfd, &amp;net_num + nsent, 4 - nsent);。更好:rc = write(sockfd, &amp;net_num , sizeof(net_num));。 ALSO:你是如何分配“缓冲区”的?它足够大吗?你传递了正确的缓冲区大小吗?既然如此,为什么不在“recv()”中简单地使用“&net_num”和“ntohl()”呢?
  • 有没有办法修复这个服务器端?

标签: c linux sockets ubuntu server


【解决方案1】:

rc = write(sockfd, &amp;net_num + nsent, 4 - nsent); 是错误的,&amp;net_num 是指向 32 位对象的指针,因此 &amp;net_num+1 将指向下一个 32 位对象。那超出了对象。您可以强制转换为 char 指针,或在发送前复制到一个小的 char 缓冲区,如下所示:


uint32_t net_num = htonl(num);
char buff[sizeof net_num];
memcpy (buff, &net_num, sizeof buff);

int nsent;
for nsent=0; nsent < sizeof buff; nsent += rc;)
{
    rc = write(sockfd, buff + nsent, 4 - nsent);
    if (rc == -1 && errno == EAGAIN) { rc=0; continue; }
    if (rc <= 0)
    {
        printf("error! write() failed: %s\n", strerror(errno));
        break;
    }


}

【讨论】:

  • 感谢您的帮助,但不幸的是,这不起作用。我投射到一个 char 指针,它没有改变任何东西。
  • 可能有更多错误。 (我像校对员一样阅读:遇到第一个错误时我停止。对不起!)
猜你喜欢
  • 2015-08-30
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多