2009-02-05 82 views
1

我們已經有了一些舊的串行代碼,通過打開它然後關閉它來檢查串行端口是否可用。現在我們通過提供ip地址作爲字符串來爲應用重新添加網絡支持。使用CreateFile打開一個套接字

/** 
* So far I have tried: 
* A passed in portPath normally looks like: 
\\?\acpi#pnp0501#1#1#{GUID}   
10.2.0.155:2001 
//10.2.0.155:2001/ 
\\.\10.2.0.155:2001\ 
\\?\10.2.0.155:2001\ 
* all without success. 
*/ 
    bool PortIsAvailable(const CString& portPath) 
    { 
     HANDLE hCom = ::CreateFile(portPath, 
            GENERIC_READ | GENERIC_WRITE, 
            0,     // comm devices must be opened with exclusive-access 
            NULL,     // no security attributes 
            OPEN_EXISTING,  // comm devices must use OPEN_EXISTING 
            FILE_FLAG_OVERLAPPED, // not overlapped I/O 
            NULL);    // hTemplate must be NULL for comm devices 
     if (INVALID_HANDLE_VALUE != hCom) 
     { 
      ::CloseHandle(hCom); 
      return true; 
     } 
     return false; 
    } 

我知道我可以使用連接,然後關機,但我想用最少的更改重用該功能。如果我能夠更好地重用這個功能。如果沒有,那麼我將不得不編寫代碼來確定它是否是套接字。

我想知道通過CreateFile打開套接字的正確方法是什麼?

回答

3

您不能通過CreateFile創建套接字。您應該爲此使用窗口socket API。要創建SOCKET句柄,請使用WSASocket。請注意,此函數返回的SOCKET可以用作一個Windows functions, such as ReadFile and WriteFile的Windows句柄。

+0

我知道你可以使用ReadFile和WriteFile,但我想你也可以使用CreateFile。看來我將不得不編寫所有額外的樣板代碼來解決系統圍繞串行端口構建的問題:-( – 2009-02-06 06:21:40

0

我不相信你可以用CreateFile()來操作套接字。套接字是從BSD(iirc)導入的抽象,並以名稱兼容的方式實現(最初通過winsock.h和當前winsock2.h)。我不認爲MS曾經爲CreateFile()添加了對套接字的支持。

更多依據:大部分(所有內容?)CreateFile()操作返回本機Windows句柄。由於套接字是非本地抽象,因此它們在操作系統中沒有本地句柄,因此CreateFile()無法處理它們。

相關問題