0

コードを以下に示します。TCP ソケットを作成し、接続を試みます。接続に失敗します。ただし、バッファには何かが残っており、ソケットは読み取り可能なままです。この場合、ソケットをクリーンアップする方法はありますか? 助けてくれてありがとう。

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/inotify.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#include <sys/select.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/epoll.h>
#include <signal.h>
#include <math.h>
#include <netdb.h>
#include <errno.h>


int main()
{
    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct sockaddr_in sai;
    sai.sin_family = AF_INET;
    int rv = inet_pton(AF_INET, "10.10.131.1", &(sai.sin_addr));
    sai.sin_port = htons(1234);

    int r = connect(sock, (struct sockaddr*)(&sai), sizeof(struct sockaddr_in));
    if (r < 0)
    {
        printf("connection failed: %s\n", strerror(errno));
    }


    fd_set r_set;
    FD_ZERO(&r_set);
    FD_SET(sock, &r_set);

    int n = select(sock + 1, &r_set, NULL, NULL, NULL);

    if (n > 0)
    {
        if (FD_ISSET(sock, &r_set))
        {
            printf("socket %d is readable\n", sock);
        }
    }

    return 0;
}

実行結果:

connection failed: Connection refused
socket 3 is readable
4

1 に答える 1

3

バッファには何もありません。「読み取り可能」であるということは、ソケットで何らかのイベントが発生したことを意味します。この時点で、接続試行が失敗したことはすでにわかっています。ここで使用しても意味がなく、select(2)何もクリーンアップする必要はありません。

于 2013-05-16T23:12:30.093 に答える