如何得知 Socket UDP 接收的來源位址與資料大小 |
尚未結案
|
cwchiang
一般會員 發表:27 回覆:11 積分:7 註冊:2003-06-09 發送簡訊給我 |
|
hdilwy
初階會員 發表:18 回覆:65 積分:41 註冊:2004-08-31 發送簡訊給我 |
參考這段程式碼!
//初始化動作要做唷 //這只是提供部分程式碼 //設定你自己要開的port //抓取你自己的位置 ReceiverAddr.sin_family = AF_INET; ReceiverAddr.sin_port = htons(Port); ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(ReceivingSocket, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr)) == SOCKET_ERROR) { printf("ERROR: bind failed with error %d\n", WSAGetLastError()); closesocket(ReceivingSocket); WSACleanup(); return; } printf("We are ready to receive 1 datagram from any interface on port %d...\n", Port); //ReceivingSocket 如果連線建立了這個socket會紀錄你跟誰連線 //SenderAddr 對方的位址存在這邊 //SenderAddrSize = sizeof(SenderAddr); int Ret; if ((Ret = recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0, (SOCKADDR *)&SenderAddr, &SenderAddrSize)) == SOCKET_ERROR) { //如果發生錯誤才會進到裡面來 printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError()); closesocket(ReceivingSocket); WSACleanup(); return; } printf("We successfully received %d bytes from address %s:%d.\n", Ret, inet_ntoa(SenderAddr.sin_addr), ntohs(SenderAddr.sin_port)); |
cwchiang
一般會員 發表:27 回覆:11 積分:7 註冊:2003-06-09 發送簡訊給我 |
|
hdilwy
初階會員 發表:18 回覆:65 積分:41 註冊:2004-08-31 發送簡訊給我 |
Ret = recvfrom(...)
那個Ret就是你要的東西
但是呢!下面這些事Error code
如果Ret 回傳的是這個的話要注意
另外你的buffer大小也要注意
10004 中止操作被 WSACancelBlockingCall 呼叫打斷。 10009 提供的檔案控制不正確。 10013 嘗試存取通訊端被拒絕,因為存取權限不足。 10014 在嘗試使用指標引數進行呼叫時,系統偵測出一個不正確的指標位址。 10022 提供了一個不正確的引數。 10024 開啟太多通訊端。 10035 無法立即完成通訊端操作,而且無法停止。 10036 目前正在終止操作。 10037 嘗試啟動一個已在進行中而且不能停止的通訊端操作。 10038 嘗試操作的對象不是通訊端。 10039 通訊端操作省略了一個必需的位址。 10040 有一個訊息傳送到資料包通訊端,這個訊息超過內部訊息緩衝區或是某些其他網路限制,或是使來接收資料包的緩衝區小於資料包本身。 10041 在通訊端函數呼叫中指定的通訊協定不支援所要求的通訊端類型語法。 10042 在 getsockopt 或 setsockopt 呼叫中指定了一個不明的,不正確的,或不受支援的參數或等級。 10043 系統中並未設定所要求的通訊協定,或是無法執行這個通訊協定。 10044 在這個位址家族中不支援指定的通訊端類型。 10045 不支援這項物件參照類型的操作。 10046 系統中並未設定所要求的通訊協定家族,或是無法執行這個通訊協定。 10047 使用了一個與要求的通訊協定不相容的位址。 10048 一次只能用一個通訊端位址 (通訊協定/網路位址/連接埠)。 10049 內容中所要求的位址不正確。 10050 通訊端操作遇到一個停用的網路。 10051 通訊端操作嘗試連線到一個無法連線的網路。 10052 連線已經失效,因為操作進行時偵測到一個失敗。 10053 連線已被您主機上的軟體中止。 10054 遠端主機已強制關閉一個現存的連線。 10055 無法在通訊端上執行操作,因為系統緩衝區空間不足,或是佇列已滿。 10056 對一個已連線的通訊端發出連線要求。 10057 不允許傳送或接收資料的要求,因為通訊端並未連線,而且 (在資料包通訊端使用 sendto 呼叫進行傳送時) 並未提供位址。 10058 不允許傳送或接收資料的要求,因為通訊端已經被先前的關機呼叫關閉。 10059 有些核心物件的參照太多。 10060 連線嘗試失敗,因為連線對象有一段時間並未正確回應,或是連線建立失敗,因為連線的主機無法回應。 10061 無法連線,因為目標電腦拒絕連線。 10062 無法翻譯名稱。 10063 名稱元件或名稱太長。 10064 通訊端操作失敗,因為目標主機已關機。 10065 通訊端操作無法連線到主機。 10066 無法移除並未清空的目錄。 10067 Windows Sockets 執行時,與它同時執行的應用程式數目可能有一定的限制。 10068 配額已用完。 10069 磁碟配額已用完。 10070 檔案控制參照無法使用。 10071 項目無法在本機使用。 10091 WSAStartup 這時無法執行,因為它用來提供網路服務的主要系統目前無法使用。 10092 不支援所要求的 Windows Sockets 版本。 10093 可能是應用程式尚未呼叫 WSAStartup,或 WSAStartup 發生失敗。 10101 WSARecv 或 WSARecvFrom 的傳回結果指出遠端群體已經初始優惠關機程序。 10102 WSALookupServiceNext 沒有其他結果可以傳回。 10103 處理 WSALookupServiceEnd 呼叫時,又收到同樣的呼叫。這個呼叫已被取消。 10104 程序呼叫表格不正確。 10105 要求的服務提供者不正確。 10106 無法載入或初始化所要求的服務提供者。 10107 不應該失敗的系統呼叫已失敗。 10108 無法識別此服務。在指定的名稱區中找不到此服務。 10109 找不到指定的類別。 10110 WSALookupServiceNext 沒有其他結果可以傳回。 10111 處理 WSALookupServiceEnd 呼叫時,又收到同樣的呼叫。這個呼叫已被取消。 10112 資料庫查詢失敗,因為查詢被拒絕。 |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |