RAW方式的SOCKET发送不成功?
我希望自己写IP头,采用了RAW的方式,但如果使用setsockopt()函数改写IP头,就会sendto()不成功,返回10049错误
如果象下面注释掉setsockopt函数,则不会返回错误。
查msdn:
WSAEADDRNOTAVAIL 
(10049) 
Cannot assign requested address. 
The requested address is not valid in its context. Normally results from an attempt to bind to an address that is not valid for the local machine. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote machine (e.g. address or port 0). 
        if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) 

printf("WSAStartup Error!\n"); 
return false; 
}  if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) 

printf("Socket Setup Error!\n"); 
return false; 

/*
flag=true; 
if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR) 

printf("setsockopt IP_HDRINCL error!\n"); 
return false; 


nTimeOver=1000; 
if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR) 

printf("setsockopt SO_SNDTIMEO error!\n"); 
return false; 

*/         ......
         ......        rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 
0, (struct sockaddr*)&addr_in, sizeof(addr_in));  if (rect==SOCKET_ERROR) 

printf("send error!:%d\n",WSAGetLastError()); 
return false; 

else 
printf("send ok!\n"); 请问高人,我到底哪里出问题了,谢谢帮忙。

解决方案 »

  1.   

    有三种可能:
    1. 你的自定义IP给错了,或szSendBuf中的检验位算错了。
    2. 有可能你的网卡不支持混合模式。
    3. 你的操作系统是windows XP 并打了SP2的补丁。(很多人在这种情况下遇到过10049或1004的错误)
      

  2.   

    1、我已经检查过了,IP和szSendBuf中的检验位都没错。
    2、如何判断我的网卡是否支持混合模式?
    3、我的操作系统是windows XP 并打了SP2的补丁,如果采用IPPROTO_ICMP就出现1004错误,其余是10049错误,那我该怎么办?谢谢xiangding(曾经沧海难为水,除却巫山不是云(*抵制日货*)的帮忙!
      

  3.   

    另外提示你一点,可以让你看到sendok,呵,把上面程序中的源IP地址,改成你本机的IP地址,应该发送就没错,
    听高人说主要是sp2出的问题,会检验是否是本机发出去的IP包,否则不发送,你程序copy到不是sp2的电脑上去试试,应该行的。再不行就重装个系统吧,做开发没必要打sp2,安全性太高
      

  4.   

    解决了,方法:
    首先把内置防火墙关了,再把Windows Firewall/Internet Connection Sharing (ICS)服务关了就OK