2012-02-25 27 views
7

tôi đã cố gắng - lần đầu tiên - để kiểm soát một ổ cắm bằng một mức độ đường thấp
Đi bộ qua hướng dẫn, tôi phải đối mặt với những dòng này:Socket.IOControl - Tài liệu nhập nhằng

byte[] byTrue = new byte [4] {1, 0, 0, 0}; 
byte[] byOut = new byte [4] {1, 0, 0, 0}; 

_Socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut); 

tôi giới thiệu đến MSDN documentation , nhưng nó thực sự rất mơ hồ.

Câu hỏi:

mảng các byte 2 là gì? Chúng được sử dụng trong cái gì?
Tài liệu nói OPTIONS - tùy chọn nào?

Trả lời

7

Đối số mảng byte cho Socket.IOControl() là cụ thể cho IOControlCode được chỉ định làm đối số đầu tiên.

Mảng đầu tiên dành cho dữ liệu đầu vào, mảng thứ hai là dành cho dữ liệu đầu ra.

Để tìm thêm thông tin về bố cục cụ thể cho các mảng này, bạn nên bắt đầu bằng cách xem liệt kê, liệt kê tất cả các hoạt động có thể có cho bạn. Từ đó, bạn nên tham chiếu chéo với tài liệu được liệt kê cho các hàm có thể hoạt động C mà Socket.IOControl() kết thúc tốt đẹp. Đây là WSAIoctl()ioctlsocket().

IOControlCode Enumeration @ MSDN

WSAIoctl() function @ MSDN
ioctlsocket() function @ MSDN

mỗi tài liệu cho IOControlCode.ReceiveAll:

Enable nhận tất cả các gói IPv4 trên mạng. Ổ cắm phải có địa chỉ gia đình InterNetwork, loại socket phải là Raw và loại giao thức phải là IP. Người dùng hiện tại phải thuộc nhóm Quản trị viên trên máy tính cục bộ và ổ cắm phải là được liên kết với một cổng cụ thể. Mã điều khiển này được hỗ trợ trên Windows 2000 và các hệ điều hành sau này. Giá trị này bằng Winsock 2 hằng số SIO_RCVALL.

Tham chiếu chéo SIO_RCVALL, chúng tôi thấy nó có mục nhập trong tài liệu winsock.

SIO_RCVALL control code @ MSDN

Đọc qua cụm từ này, nó đề cập đến rằng bộ đệm đầu vào là cần thiết để lựa chọn một phương thức hoạt động, với kích thước tối thiểu tương ứng với một RCVALL_VALUE. Trong tuyên bố của bạn, bạn đang chuyển giá trị 1 trong mảng đối số đầu vào. Chúng tôi có thể kiểm tra các tệp tiêu đề để xem điều này có ý nghĩa gì.

Bạn nên kiểm tra kỹ điều này bằng các tệp tiêu đề C, nhưng bản sao tương thích với giao diện cho rượu (trình mô phỏng cửa sổ) cho biết giá trị cho chế độ RCVALL_ON1. Phương thức .NET sẽ bao bọc các chi tiết về việc quản lý kích thước mảng cho bạn, do đó đoạn mã bạn gặp phải đang cố gắng kích hoạt RCVALL_ON cho socket.

Dưới đây là liên kết đến tập tin tiêu đề C tại winehq.org: mstcpip.h at winehq.org

Nếu bạn đã cài đặt C/C++ hỗ trợ cho visual studio, bạn có thể xác định vị trí mstcpip.h và winsock2.h cục bộ tại một con đường tương tự như sau:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\ 

bản sao của tôi nói:

// 
// Values for use with SIO_RCVALL* options 
// 
typedef enum { 
    RCVALL_OFF    = 0, 
    RCVALL_ON    = 1, 
    RCVALL_SOCKETLEVELONLY = 2, 
    RCVALL_IPLEVEL   = 3, 
} RCVALL_VALUE, *PRCVALL_VALUE; 

tôi không thể tìm thấy bất kỳ tài liệu mà cụ nói s mảng byte kích thước nào nên được sử dụng để vượt qua một RCVALL_VALUE, nhưng nếu bạn nhìn vào các mẫu cho IOControl(), chúng sử dụng BitConverter.GetBytes(0) cho các tham số mặc định có kích thước 4 byte (tương ứng với .NET int) và khớp với ví dụ của bạn . Điều này đủ lớn để phù hợp với hoạt động của RCVALL_VALUE trong C.

+0

Cảm ơn nhận xét hữu ích chi tiết của bạn, nhưng mảng "byOut" thì sao? –

+1

Khe tham số được chỉ định bằng 'byOut' là nhận dữ liệu trở lại từ tính năng IOControl được chọn. Trong trường hợp của SIO_RCVALL, không có dữ liệu trả về đặc biệt nào được mong đợi (xem ghi chú cho lpvOutBuffer trên liên kết SIO_RCVALL). Bạn có thể truyền một mảng trống hoặc thậm chí là null. – meklarian

0

Mảng đầu tiên phải chứa byte bạn sẽ ghi - dữ liệu sẽ được gửi- Mảng thứ hai sẽ chứa dữ liệu đầu ra khi hoạt động nhận được thực hiện. Vì vậy, theo hoạt động IOControlCode, bạn sẽ đặt một trong hai tham số thành null.

+0

Đặt cả hai thành vô giá trị lỗi! –

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