簡體   English   中英

在TCP端口上偵聽時沒有任何反應

[英]Nothing happens when listening on a TCP port

我正在嘗試編寫一個小的示例應用程序來偵聽TCP端口,但是由於某些原因它無法正常工作。

它看起來似乎達到了accept(3p) ,但是lsof -i :1080報告該端口上沒有監聽。 沒有錯誤,或者其他任何明顯的錯誤。

有什么提示嗎?

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

const int THREADS = 4;
const int BUFFER_SIZE = 256;

void usage(char *app_name) {
    printf("Usage: %s PORT\n", app_name);
}

int main(int argc, char **argv) {
    struct sockaddr_in6 serv_addr, addr_cli;
    char buffer[BUFFER_SIZE];
    int sockfd, sock_cli, n, port;

    if (argc < 2) {
        usage(argv[0]);
        return -1;
    }

    port = atoi(argv[1]);

    if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0) {
        perror("Could not open socket");
        return errno;
    }

    serv_addr.sin6_family = AF_INET6;
    serv_addr.sin6_port = htonl(port);
    // other addresses: INADDR_LOOPBACK, INADDR_ANY
    serv_addr.sin6_addr = in6addr_any;
    serv_addr.sin6_scope_id = 0;

    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0) {
        perror("Could not bind to socket");
        return errno;
    }

    if (listen(sockfd, THREADS + 1) < 0) {
        perror("Could not listen to socket");
        return errno;
    }

    printf("Listening on :%d\n", port);

    unsigned long l;
    if ((sock_cli = accept(sockfd, (struct sockaddr *) &addr_cli, (socklen_t*) &l)) != 0) {
        perror("Could not accept connections on socket");
        return errno;
    }

    printf("Connection accepted\n");

    while ((n = recv(sock_cli, buffer, BUFFER_SIZE, 0)) > 0) {
        printf("> Got data: %s\n", buffer);
    }

    if (n < 0) {
        printf("Could not receive data\n");
        return errno;
    }

    printf("Bye!\n");
}

我有你的程序可以工作

$ ./hugo 8888 &
[1] 25330
$ Listening on :8888
telnet -6 localhost 8888
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Connection accepted
hello 
> Got data: hello
^]
telnet> quit
Connection closed.
Bye!
[1]+  Exit 10                 ./hugo 8888

進行以下更改:

#include <netinet/in.h>
...
serv_addr.sin6_port = htons(port);
...
if ((sock_cli = accept(sockfd,  
                       (struct sockaddr *) &addr_cli, 
                       (socklen_t*) &l)) == -1) {

正如評論所建議的, htons (3)導致偵聽正確的端口。 並且accept (2)返回一個套接字,因此您已明確測試-1

如果我能提出兩個小建議,

  • main返回EXIT_SUCCESS。 :-)
  • 使用err (3)代替perror (3)。 更少的輸入,您真的不想返回errno

暫無
暫無

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

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