2010-07-10 36 views
8

Tôi đang viết một chương trình để nắm bắt lưu lượng mạng ổ cắm để hiển thị hoạt động mạng. Đối với điều này, tôi đã tự hỏi nếu có bất kỳ cách nào tôi có thể xác định loại socket từ bộ mô tả socket.(Làm cách nào) Tôi có thể tìm loại ổ cắm từ bộ mô tả ổ cắm không?

Tôi biết rằng tôi có thể tìm thấy gia đình ổ cắm bằng cách sử dụng getockname nhưng tôi không thể tìm thấy cách tìm loại ổ cắm.

Ví dụ: tôi muốn tìm xem ổ cắm này có được mở dưới dạng UDP hoặc TCP hay không. Cảm ơn mọi lời khuyên trước.

YEH

Trả lời

16

Vì bạn đề cập đến getsockname Tôi giả sử bạn đang nói về ổ cắm POSIX.

Bạn có thể lấy loại ổ cắm bằng cách gọi hàm getsockopt với SO_TYPE. Ví dụ:

#include <stdio.h> 
#include <sys/socket.h> 

void main (void) { 
    int fd = socket(AF_INET, SOCK_STREAM, 0); 
    int type; 
    int length = sizeof(int); 

    getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &length); 

    if (type == SOCK_STREAM) puts("It's a TCP socket."); 
    else puts ("Wait... what happened?"); 
} 

Lưu ý rằng ví dụ của tôi không thực hiện bất kỳ kiểm tra lỗi nào. Bạn nên khắc phục điều đó trước khi sử dụng nó. Để biết thêm thông tin, hãy xem tài liệu POSIX.1 cho getsockopt()sys/socket.h.

+0

Cảm ơn bạn rất nhiều! Tôi chắc chắn sẽ kiểm tra lỗi. – YEH

+0

getockname() và getockopt() không dành riêng cho POSIX. Winsock API của Microsoft cũng có chúng. –

+0

@Remy Lebeau Có, cả hai đều dựa trên lớp socket BSD. Có một số khác biệt quan trọng, nhưng việc sử dụng đơn giản như vậy của getockopt() có thể giống nhau. –

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