user: 下面的汇编指令对应的C源代码是什么:

```asm
<server_setget_info>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x30(%rbp)
  movl   $0x0,-0x2c(%rbp)
  movl   $0x5000,-0x28(%rbp)
  mov    D32(%rip),%rax
  mov    (%rax),%ecx
  mov    D38(%rip),%rax
  mov    (%rax),%eax
  mov    $0x0,%edx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <socket@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x14(%rbp),%rax
  mov    $0xc,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    D38(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,-0xc(%rbp)
  mov    D28(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,%edi
  call   <htonl@plt>
  mov    %eax,-0x10(%rbp)
  mov    -0x28(%rbp),%eax
  mov    %eax,%edi
  call   <htons@plt>
  mov    %eax,-0x14(%rbp)
  lea    -0x14(%rbp),%rcx
  mov    -0x30(%rbp),%eax
  mov    $0xc,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <bind@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x30(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <listen@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x30(%rbp),%eax
  mov    $0x0,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <accept@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x34(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <write@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x4,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  lea    -0x20(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    $0x8,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <read@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x8,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x40(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <read@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x4,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x48(%rbp),%rcx
  mov    -0x24(%rbp),%eax
  mov    $0x4,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <read@plt>
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x4,-0x2c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x20(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L4
  call   <__stack_chk_fail@plt>
L4:
  leave
  ret
```

assistant: ```c
size_t server_setget_info(int port, int *num_threads, int *persist_with_reads) {
  struct sockaddr_in serv_addr;
  int lfd = 0, ret = 0, connfd;
  size_t buffer_size;
  int conn_port = 20480;
  lfd = socket(AF_INET, SOCK_STREAM, 0);
  assert(lfd);
  memset(&serv_addr, 0, sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  serv_addr.sin_port = htons(conn_port);
  ret = bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
  assert(ret == 0);
  ret = listen(lfd, 1);
  assert(ret == 0);
  connfd = accept(lfd, (struct sockaddr *)NULL, NULL);
  assert(connfd);
  ret = write(connfd, &port, sizeof(port));
  assert(ret == sizeof(port));
  ret = read(connfd, &buffer_size, sizeof(buffer_size));
  assert(ret == sizeof(buffer_size));
  ret = read(connfd, num_threads, sizeof(int));
  assert(ret == sizeof(int));
  ret = read(connfd, persist_with_reads, sizeof(int));
  assert(ret == sizeof(int));
  close(connfd);
  close(lfd);
  return buffer_size;
}
```