看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 最近在學winsock,寫了一隻ping的程式,想改成traceroute 所以從TTL下手,需要利用setsockopt()改TTL,結果程式跑過去 TTL依然沒有被改到,而且setsockopt()還回了-1這個值 找了2天都找不到問題,看別人例題也是寫得很輕鬆... 希望得到的正確結果: 我目前只希望能順利把TTL值改掉 程式跑出來的錯誤結果: TTL值不變,而且setsockopt()返回-1值 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) VC++ 6.0 有問題的code: (請善用置底文標色功能) WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2,0); SOCKET rawSocket; int THETTL = 0; int rcTTL; // 開啟WinSock nRet = WSAStartup(wVersionRequested, &wsaData); if(nRet) { fprintf(stderr,"\nError initializing WinSock\n"); return; } // 判斷版本 if(wsaData.wVersion != wVersionRequested) { fprintf(stderr,"\nWinSock version not supported\n"); return; } rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(rawSocket == SOCKET_ERROR) { ReportError("socket()"); return; } rcTTL = setsockopt(rawSocket, IPPROTO_IP, IP_TTL, (char *)&THETTL, sizeof(int)); 補充說明: 程式最後的兩段,我用socket初始了rawSocket, 然後使用setsockopt()想改TTL,就這樣寫,結果TTL就是不會變... 我看不出我哪裡語法錯了,而且rcTTL得到的值是-1,查了一下也沒查到-1代表什麼 如果有大大有過這樣的經驗並且知道怎麼解決 可以給我一些指點嗎?真的太感謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.187.253.29 問題解決了。 我本來使用 #include <winsock.h> 後來改用 #include <winsock2.h> #include <ws2tcpip.h> 就改到TTL了,其他程式內容都沒改... 好瞎,這是怎麼樣呢?版本問題嗎? 謝謝大家 ※ 編輯: liwmewmew 來自: 218.187.253.29 (06/24 22:32)
ljhgc:eader 06/24 22:38
ljhgc: Declared in Winsock2.h. 06/24 22:38
ljhgc: 06/24 22:38
ljhgc:Library 06/24 22:38
ljhgc: Use Ws2_32.lib. 06/24 22:38
ljhgc: 06/24 22:38
ljhgc:DLL 06/24 22:38
ljhgc: Requires Ws2_32.dll. 06/24 22:38
ljhgc: 06/24 22:38
確實,我本身一開始就有插了 #pragma comment (lib, "Ws2_32.lib") 在程式碼上面,是因為這樣才會跟一開始的 #include <winsock.h> 不合嗎? 而必須使用 #include <winsock2.h> #include <ws2tcpip.h> 才合嗎? 謝謝大大@@" ※ 編輯: liwmewmew 來自: 218.187.253.29 (06/24 22:56)