2009-12-08 15 views
13

Tôi đã bắt đầu viết điều khiển ActiveX sử dụng ổ cắm.Có thể biết liệu WSAStartup có được gọi trong một tiến trình không?

Các ứng dụng sử dụng điều khiển này có thể hoặc không thể sử dụng ổ cắm. Tôi có thể kiểm soát được liệu WSAStartup có được gọi không?

Nếu không, hãy gọi. Một thử nghiệm nhỏ cho thấy rằng việc gọi WSAStartup nhiều lần được đẩy mạnh. Nhưng điều gì xảy ra nếu một phiên bản winsock khác được yêu cầu? điều này sẽ phá vỡ các phần khác của ứng dụng?

Trả lời

26

Có thể thực hiện được.

Và đây là cách thực hiện.

bool WinsockInitialized() 
{ 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (s == INVALID_SOCKET && WSAGetLastError() == WSANOTINITIALISED){ 
     return false; 
    } 

    closesocket(s) 
    return true; 
} 

int main() 
{ 
    //... 
    if (!WinsockInitialized()) 
     // Init winsock here... 

    // Carry on as normal. 
    // ...   
} 

Nhưng không thực sự cần thiết để thực hiện việc này. Hoàn toàn an toàn khi gọi WSAStartup bất cứ lúc nào. Cũng an toàn khi kết thúc từng cuộc gọi thành công tới WSAStartup() với một cuộc gọi phù hợp với WSACleanup().

ví dụ:

// socket calls here would be an error, not initialized 
WSAStartup(...) 
// socket calls here OK 

WSAStartup(...) 
// more socket calls OK 

WSACleanup() 
// socket calls OK 

WSACleanup() 

// more socket calls error, not initialized 
+6

Đừng quên gọi 'closesocket()' nếu 'socket()' thành công trong 'WinsockInitialized()', nếu không bạn sẽ bị rò rỉ. –

+1

điểm tốt! cố định điều đó. – Matt

+0

KHÔNG an toàn khi gọi WSAStartup bất cứ lúc nào. Từ MSDN: "Hàm WSAStartup thường dẫn đến các DLL trợ giúp đặc trưng cho giao thức đang được nạp. Kết quả là, hàm WSAStartup không nên được gọi từ hàm DllMain trong một tệp DLL ứng dụng. Điều này có thể gây ra deadlocks" – czz

2
  • Không, không thể biết được WSAStartup() đã được gọi hay chưa.

  • Có, WSAStartup() có thể được gọi nhiều lần trong một quy trình duy nhất, miễn là phiên bản được yêu cầu được hỗ trợ bởi WinSock DLL. Các cuộc gọi đến WSAStartup()WSACleanup() phải được cân bằng.

  • Khởi tạo WinSock là một quá trình được thương lượng; bạn chịu trách nhiệm xác thực thông tin mà WSAStartup() trả về để đảm bảo thông tin đáp ứng các yêu cầu của ứng dụng của bạn.

  • Ổ cắm hiện tại không bị ảnh hưởng bởi các cuộc gọi WSAStartup() tiếp theo.

  • Nhiều ổ cắm sử dụng các phiên bản WinSock khác nhau được cho phép.

Xem the WSAStartup() documentation để biết thêm thông tin.

+0

Thêm vào đó, tôi nhận thấy rằng miễn là số cuộc gọi WSACleanup khớp với số cuộc gọi WSAStartup thành công thì gọi WSACleanup sẽ không ảnh hưởng đến các cuộc gọi socket khác. Tất nhiên là bạn không gọi WSACleanup quá nhiều lần. – Matt

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