[問題] TCP/IP 非同步模型

看板C_and_CPP作者 (老柏~)時間14年前 (2011/09/06 23:23), 編輯推噓3(3012)
留言15則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Visual Stdio 6 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) WS2_32.lib 問題(Question): 最近在研習TCP/IP 的通訊協定 主要在學UDP 目前最基本的程式照著參考書就寫得出來 可是一碰到阻攔式 非阻攔式 非同步式 (主要需要的是非同步式的) 但只要一碰到 就會提到視窗化的程式碼 像是DialogBox..... 不知道可以怎麼避掉 暫時不想碰視窗化的程式 但是一碰到就卡關 BOOL CALLBACK DialogProc(HWND hDlg, UINT MSG, WPARAM wParam, LPARAM lParam) { switch(MSG) { case WM_INITDIALOG: { WSAAsyncSelect(sock, hDlg, WM_SOCKETREAD, FD_READ); }break; case WM_COMMAND: { switch(wParam) { case IDC_OK: case IDC_CANCEL: EndDialog(hDlg, 0); break; } }break; case WM_SOCKETREAD: { SOCKADDR from; char buffer[256]; int len = sizeof(SOCKADDR); memset(buffer, '\0', 256); recvfrom(sock, buffer, sizeof(buffer)-1, 0, &from, &len); SetDlgItemText(hDlg, IDC_MESSAGE, buffer); }break; } return(0); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { WSADATA data; if (WSAStartup(MAKEWORD(2,2), &data) != 0) return(0); int ret; sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (!sock) { WSACleanup(); return(0); } saServer.sin_family = AF_INET; saServer.sin_addr.s_addr = INADDR_ANY; saServer.sin_port = htons(APP_PORT); ret = bind(sock, (SOCKADDR *)&saServer, sizeof(SOCKADDR)); if (ret) { WSACleanup(); return(false); } DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); closesocket(sock); WSACleanup(); return(1); } 這些地方可不可以用其他的方式來寫 真的很頭痛 感謝前輩們指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.119.192

09/06 23:24, , 1F
我在想,你用另一個thread去做事,會不會比較容易些?
09/06 23:24, 1F

09/06 23:27, , 2F
可否詳細說明 ... THX
09/06 23:27, 2F

09/06 23:38, , 3F
不想寫視窗幹嘛又用 WinMain ?
09/06 23:38, 3F

09/06 23:41, , 4F
我想這個是原po找到的範例,他想要改寫成非視窗版
09/06 23:41, 4F

09/06 23:43, , 5F
.. 其實可以連 WinMain 一起拿掉吧..
09/06 23:43, 5F

09/06 23:50, , 6F
他是因為要用 WSAAsyncSelect(sock, hWnd, WM_SOCKETREAD
09/06 23:50, 6F

09/06 23:51, , 7F
讓 Windows 傳通知訊息,所以至少得建一個視窗才能收訊息
09/06 23:51, 7F

09/06 23:52, , 8F
原來如此,謝謝 p 大解釋.
09/06 23:52, 8F

09/06 23:52, , 9F
在 WM_SOCKETREAD 裡也只有一個設定對話方塊控制項,要顯
09/06 23:52, 9F

09/06 23:52, , 10F
示什麼文字的 SetDlg... 你可能沒學過而已吧
09/06 23:52, 10F

09/06 23:53, , 11F
不過我還真不知這個程式能不能改成純Console版...??
09/06 23:53, 11F

09/06 23:55, , 12F
WSAAsyncSelect 那裡用 beginthread下去,其它顯示用
09/06 23:55, 12F

09/06 23:55, , 13F
printf, 讀入 editbox 用 scnaf, 這樣不行嗎?
09/06 23:55, 13F

09/06 23:57, , 14F
我能想到的也是用thread... 但好像會有點不太一樣
09/06 23:57, 14F
文章代碼(AID): #1EPZhdRq (C_and_CPP)