2012-04-21 42 views

Trả lời

21

Điều này có thể được kiểm tra với getsockopt (SO_ACCEPTCONN). Ví dụ:

#include <sys/socket.h> 

int val; 
socklen_t len = sizeof(val); 
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1) 
    printf("fd %d is not a socket\n", fd); 
else if (val) 
    printf("fd %d is a listening socket\n", fd); 
else 
    printf("fd %d is a non-listening socket\n", fd); 
-1

Bạn thực sự không thể biết được. Bạn phải tự theo dõi nó và khi bạn muốn kiểm tra xem ổ cắm có phải là ổ cắm nghe bạn so sánh với ổ cắm bạn đã lưu hay không.

+0

Vâng, tôi vừa nghĩ đến việc thêm nó vào bộ mô tả tệp và sử dụng để kiểm tra. Cảm ơn bạn đã trả lời! –

+2

'getockopt (SOL_SOCKET, SO_ACCEPTCONN)' là cách chính xác để kiểm tra ổ cắm để nghe. Thay vào đó, bạn nên chấp nhận câu trả lời của mark4o. –

+0

@RemyLebeau Tôi không biết điều đó. Mặc dù nó có thể là mã nhiều hơn, nhưng nó phù hợp hơn với câu hỏi của OP. –

-1

Bạn có thể chạy trong dòng lệnh (trên môi trường Mac/Linux):

lsof -i 

và/hoặc (Linux/Mac/Windows môi trường)

netstat -a 
+0

Ông yêu cầu một giải pháp C (không phải tôi đã xuống). – peterh

0

Nói đúng ra, bạn có thể hãy thử thực hiện một thao tác trên ổ cắm để xác định ngẫu nhiên loại ổ cắm nào, như cố gắng chấp nhận một kết nối từ nó. Nếu accept() thất bại với EINVAL, đó là một dấu hiệu khá tốt mà nó không phải là lắng nghe. :)

Tuy nhiên, việc theo dõi các ổ cắm nào là giải pháp tốt hơn. Trừ khi bạn đang xây dựng một ứng dụng thực sự tầm thường, rất có thể là bạn sẽ cần phải giữ một số loại dữ liệu bổ sung trên mỗi ổ cắm anyway.

Các vấn đề liên quan