c - C 中的服务器-客户端 : Weird behaviour when sending bytes

标签 c linux sockets ubuntu server

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

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...

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

更奇怪的是,如果我在没有打印的情况下编译服务器,则会出现段错误。如果我取消注释 printf,它就可以正常工作。这看起来 super 奇怪。

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

最佳答案

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

<小时/>
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;
    }


}

关于c - C 中的服务器-客户端 : Weird behaviour when sending bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821325/

相关文章:

c - 使用 GDB 跟踪和记录变量值

java - 如何在 JUnit 测试中的不同线程中启动 Main.main()

java - 在UDP Socket Java Android上发送多个数据

java.net.SocketException : No buffer space available (maximum connections reached? ): 连接

C- 服务器/客户端,等待其他客户端然后退出

c - Segmentation fault和Struct的关系

c - 将 char[][] 传递给 execvp 时出现问题

ruby - RVM Ruby 2.0.0 在 Ubuntu 11 中安装失败

程序可以在有两个信号挂起时运行吗

linux - 为什么 "service sshd start"命令不能返回命令提示符?