【问题标题】:gcc: wrong behaviour after new variable was addedgcc:添加新变量后的错误行为
【发布时间】:2011-04-10 10:47:51
【问题描述】:

我正在编写简单的程序:服务器和客户端。你知道,我只是在学习所有这些东西。

我添加了新变量(server.c 中的 fileUp),而客户端刚刚崩溃。我用gdb调试它。客户端无法从套接字读取任何内容。没有那个变量就可以正常工作。

我确实用 gcc 和 g++ 和 -Wall 编译了这些程序。没有错误,没有警告。

程序尽可能简单。我不明白出了什么问题。

任何提示将不胜感激。

服务器.c

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct sockaddr_in address, client;
  int s = socket(AF_INET, SOCK_STREAM, 0);

  memset(&address, 0, sizeof(address));
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = htonl(INADDR_ANY);
#define PORT 54321
  address.sin_port = htons(PORT);


  if(bind(s, (struct sockaddr *)&address, sizeof(address))<0) {
    perror("nie udał się bind");
    exit(-1);
  }

  if(listen(s, 5)<0) {
    perror("nie udał się listen");
    exit(-1);
  }

  socklen_t client_len;
  int c = accept(s, (struct sockaddr *)&client, &client_len);

  int file = open("../data", O_RDONLY);
  if(file<0) {
    perror("nie udało się otworzyć pliku");
    exit(-1);
  }

#define MAX 1024
  char buf[MAX];
  int n = read(file, buf, MAX);
  int fileUp = n;

  do {
    write(c, buf, MAX);
    buf[n-1] = '\0';
    printf("%d: %s\n", n, buf);
    /*fileUp += n;
      printf("pobrano: %d\n", fileUp);*/
    n = read(file, buf, MAX);
    getchar();
  } while(n != 0);

  close(c);
  close(s);

  return 0;
}

client.c

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) {
  struct sockaddr_in address;
  int s = socket(PF_INET, SOCK_STREAM, 0);

  memset(&address, 0, sizeof(address));
  address.sin_family = AF_INET;
#define PORT 54321
  address.sin_port = htons(PORT);

  if(inet_pton(AF_INET, argv[1], &address.sin_addr) <=0) {
    perror("podano nieprawidłowy adres");
    exit(-1);
  }

  if(connect(s, (struct sockaddr *)&address, sizeof(address))<0) {
    perror("nie można się połączyć");
    exit(-1);
  }

#define MAX 1024
  char buf[MAX];
  int n = read(s, buf, MAX);
  int fileDown = n;

  do {
    buf[n-1] = '\0';
    printf("%d: %s\n", n, buf);
    n = read(s, buf, MAX);
    fileDown += n;
    printf("pobrano: %d\n", fileDown);
  } while(n != 0);

  close(s);
  return 0;
}

【问题讨论】:

  • 只是好奇:你在哪所大学? (我猜是在波兰)
  • 你会知道的。拼写为 server,而不是 serwer。
  • 最好的例子,为什么“编译没有警告和错误”并不意味着“工作”,更不用说“永不失败”。

标签: c gcc network-programming


【解决方案1】:

socklen_t client_len; 应该是socklen_t client_len = sizeof(client);

当您添加新变量时,堆栈布局将发生变化 - 因此 client_len 中的未初始化值只是碰巧在之前起作用,它在之后不起作用 - 很可能使您的 accept 调用失败,然后您试图写入无效的 FD。

你当然也应该检查accept的返回值

【讨论】:

  • ...还有write的返回值。
  • 现在我觉得自己很愚蠢,从今天开始我还没有意识到这一点(需要初始化):(
猜你喜欢
  • 2010-09-30
  • 2018-03-21
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多