簡體   English   中英

C-首次調用recv()后,“傳輸端點未連接”

[英]C - “Transport endpoint is not connected” after first recv() call

我剛剛開始學習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;
}

和一台服務器:

服務器

#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()調用中收到消息“傳輸端點未連接”

我確實讀過其他有關此問題,但是問題是數據應該發送到從accept()調用返回的套接字中……但是我認為這就是我正在做的事情。 我究竟做錯了什么?? ...我知道這有點愚蠢,但是我是一個真正的初學者。

如果每次都在同一端口上重新啟動服務器,則可能會發現該端口仍被OS視為正在使用。 這是為了允許有時間從上次服務器運行向客戶端傳遞任何正在進行的請求。

您可以通過為操作碼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);

請注意,以上代碼段會檢查錯誤返回。 如果您檢查了每個調用的返回碼,您將自己在這里發現問題(如果不是解決方案)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM