【问题标题】:C socket recv function returning undefined error (errno)C socket recv 函数返回未定义的错误(errno)
【发布时间】:2020-09-01 02:12:24
【问题描述】:

我正在尝试制作一个文件传输程序。我目前正在编写 C 服务器并使用一个简短的 Python 脚本作为客户端。当我尝试将文件名从 Python 发送到 C 时,recv 函数(在 C 中)返回一个未定义的错误。它曾经收到一半的文件名。这是代码: C服务器(指出有问题的recv函数):



#define BUFFER 2000000
#define HEADERSIZE 20
#define PORT 9342
#define FGET "FGET"
#define UPLD "UPLD"

typedef struct timeval timeval_t;

int i;
fd_set readlist, sockets;

void* sendf(void* sock){
  printf("File Descriptor: %d\n", *(int*)sock);
  fflush(stdout);
  char* filename = (char*) malloc(21*sizeof(char));
  ssize_t result = recv(*(int*)sock, filename, 20+1, 0);
  if (result != 0){
    printf("%s", strerror(errno));
    exit(0);
  }
  printf("Filename: ");
  puts(filename);
  FILE* sfile = fopen(filename, "rb");
  free(filename);
  fseek(sfile, 0, SEEK_END);
  unsigned long long filesize = ftell(sfile);
  fseek(sfile, 0, SEEK_SET);
  char* content = malloc(BUFFER);
  for(i=0; i<=ceil(filesize/BUFFER); ++i){
    if (filesize >= BUFFER){
      fread(content, BUFFER, 1, sfile);
      filesize-=BUFFER;
      fseek(sfile, filesize-1, SEEK_END);
    } else{
      fread(content, filesize, 1, sfile);
    }
    content = realloc(content, BUFFER);
  }
  fclose(sfile);
  char* header = malloc(HEADERSIZE);
  sprintf(header, "%20llu", filesize);
  send(*(int*)sock, header, 20, 0);
  send(*(int*)sock, content, filesize, 0);
  free(filename);
  free(content);
  free(header);
  return NULL;
}

void* receivef(void* sock){
  printf("Function not written yet");
  return NULL;
}

int main(){

  chdir("/Users/reimeytal/Desktop/Fileserver");
  int sock = socket(AF_INET, SOCK_STREAM, 0);
  pthread_t thread;
  timeval_t timeout;
  timeout.tv_sec = 1;
  timeout.tv_usec = 0;
  struct sockaddr_in server;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = INADDR_ANY;
  server.sin_family = AF_INET;
  FD_ZERO(&sockets);
  FD_SET(sock, &sockets);
  bind(sock, (struct sockaddr*)&server, sizeof(server));
  listen(sock, 5);
  int maxsock = sock;
  int clientsock;
  char* msghdr = (char*) malloc(5*sizeof(char));
  while (1){
    readlist = sockets;
    select(FD_SETSIZE, &readlist, NULL, NULL, &timeout);
    for(i=0; i<=maxsock; i++){
      if(FD_ISSET(i, &readlist)){
        if(i==sock){
          clientsock = accept(sock, NULL, NULL);
          FD_SET(clientsock, &sockets);
          if(clientsock>sock){
            maxsock = clientsock;
          }
        } else{
          printf("Incoming message from %d\n", i);
          fflush(stdout);
          recv(i, msghdr, 5, 0);
          clientsock = i;
          if(strcmp(msghdr, FGET) == 0){
            pthread_create(&thread, NULL, sendf, (int *)&clientsock);
          }/*else if(strcmp(msghdr, UPLD) == 0){
            pthread_create(&thread, NULL, receivef, (int*)&i);
          }else{
            puts("ERROR: Received invalid message header");
          }*/
          msghdr = (char *) realloc(msghdr, 5*sizeof(char));
        }
      }
    }
  }
  return 0;

运行时的结果:

Incoming message from 4
File Descriptor: 4
Incoming message from 4
Incoming message from 4
Undefined error: 0

Python 客户端:

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9342))
sock.send(b'FGET\0')
sock.send(b'abcdeftghijklmno.txt\0')

如果有人需要我澄清/添加一些内容,我很乐意这样做。谢谢

【问题讨论】:

  • 我编译并执行了,它对我有用。

标签: python c sockets errno


【解决方案1】:

这里有一个错误:

ssize_t result = recv(*(int*)sock, filename, 20+1, 0);
  if (result != 0){
    printf("%s", strerror(errno));
    exit(0);
  }

recv 返回写入的字节数,所以你应该检查if (result &lt;= 0)

您收到的结果代码为 0,因为 Python 应用程序在发送数据后关闭了连接。除此之外,一切都应该工作。

编辑:删除了有关不正确的计时问题的部分。

【讨论】:

  • VG 但您提到的时间问题是虚构的。 TCP 将传递关闭之前发送的所有数据。
  • 你是对的,我的错。在这种情况下,实际上似乎整个事情都在工作,但 OP 对套接字最后关闭的事实感到困惑。
猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2015-03-09
相关资源
最近更新 更多