C - 第一次 recv() 调用后的 "Transport endpoint is not connected"

标签 c sockets recv

我刚开始用 C 语言学习网络编程。我做了一些测试,但遇到了一个错误。

我有一个客户:

客户端.c

#include <string.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>

int main(void)
{
    struct addrinfo hints, *res;
    int sock;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;

    getaddrinfo("localhost", "5996", &hints, &res);
    sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    connect(sock, res->ai_addr, res->ai_addrlen);
    char data[64];
    int len = 13;
    int br = recv(sock, data, len, 0);
    printf("%s\n%s\n%d\n", strerror(errno), data, br);
    return 0;
}

和服务器:

server.c

#include <string.h>
#include <netdb.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MYPORT "5996"
#define BACKLOG 10

int main(void)
{
    struct sockaddr_storage their_addr;
    socklen_t addr_size;
    struct addrinfo hints, *res;
    int sockfd, new_fd;

    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;

    getaddrinfo(NULL, MYPORT, &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    bind(sockfd, res->ai_addr, res->ai_addrlen);
    listen(sockfd, BACKLOG);

    addr_size = sizeof their_addr;
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
    char *msg = "Hello World!!";
    int len = strlen(msg);
    int bs = send(new_fd, msg, len, 0);
    close(sockfd);
}

当我启动服务器时,它会等待连接,如果我启动客户端,我会收到消息“Hello World!!”,但是,一分钟左右,如果我尝试运行服务器,然后再次运行客户端,我从 strerror() 调用中收到消息 “Transport endpoint is not connected”

我确实阅读了有关此的其他问题,但问题是数据应该发送到从 accept() 调用返回的套接字......但我认为这就是我正在做的. 我究竟做错了什么?? ...我知道这很愚蠢,但我是一个真正的初学者。

最佳答案

如果您每次都在同一个端口上重新启动服务器,您可能会发现该端口仍被操作系统视为正在使用中。这是为了留出时间来为上次服务器运行的客户端传送任何正在进行的请求。

您可以通过为操作码 SO_REUSEADDR 调用 setsockopt 来覆盖它

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
int reuse = 1;
int err = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
if (0 == err)
    err = bind(sockfd, res->ai_addr, res->ai_addrlen);

请注意,上面的代码片段检查错误返回。如果您检查每个调用的返回码,您就会在这里自己发现问题(如果不是解决方案的话)。

关于C - 第一次 recv() 调用后的 "Transport endpoint is not connected",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832119/

相关文章:

标准库和 POSIX 之间的时钟函数

将 IP 地址与 C 编程进行比较

c++ - 我可以将accept()与IOCP一起使用吗?

python - python3.6 : socket. recv()vs socket.recv_into()性能

C 套接字 - send() 发送,recv() 不接收

c - XOR 如何防止 shellcode 中的 NULL 字节

c - 这个函数的原型(prototype)看起来如何才能可编译?

php - ProxyPass 失败 : Error during WebSocket handshake: Unexpected response code: 500

python - 绑定(bind)调用中发生了什么? (Python+套接字+strace)

sockets - 在一个套接字上同时进行 recv() 和 send() 是否安全?