gcc:添加新变量后的错误行为

时间:2011-04-10 10:47:52

标签: c gcc network-programming

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

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

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

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

任何提示都会受到赞赏。

server.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;
}

1 个答案:

答案 0 :(得分:4)

socklen_t client_len;应为socklen_t client_len = sizeof(client);

当您添加新变量时,堆栈布局会发生变化 - 因此client_len中的未初始化值恰好在之前工作,而不是之后 - 很可能使您的accept调用失败,并且然后你试图写一个无效的FD。

您当然也应该检查accept

的返回值