作者liwmewmew (如果大海能夠)
看板C_and_CPP
標題[問題] winsock裡,setsockopt()改不掉TTL值,會回-1
時間Thu Jun 24 21:46:31 2010
遇到的問題: (題意請描述清楚)
最近在學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)