为什么我用raw socket不能对无线网卡进行发包的操作?
用raw socket做的一个发包程序,对无线网卡不起作用,但对普通的realtek 8139的网卡却可以,
不知为什么?
代码如下:
void CRemoteSimDlg::OnBnClickedBConnect()
{
UpdateData(TRUE);
sprintf(g_strIP,(LPCSTR)m_strIP);
g_nProtocol=m_nProtocol;
if (m_nLength>=16*1024)
m_nLength=16*1024;
if (m_nLength<=0)
m_nLength=1;
if (m_nTimer<0)
m_nTimer=1;
if (m_nTimer>10000)
m_nTimer=10000;
//sprintf(g_strIP1,(LPCSTR)m_strIP1);
static int bStart=0;
if (bStart==0)
{
int err;
m_s=socket(AF_INET,SOCK_RAW,IPPROTO_IP); //g_nProtocol);
if (m_s==INVALID_SOCKET)
::MessageBox(NULL,"Create Mulicast error!","Loopback",MB_OK);
//指定哪片网卡进行发送add by peterwu
UpdateData(TRUE);
hostent *pHostent;
unsigned long add=inet_addr(m_IPAddr);
pHostent=gethostbyaddr((char *)&add,sizeof(add),AF_INET);
//
struct sockaddr_in address;
address.sin_family=AF_INET;
memcpy(&address.sin_addr.s_addr,pHostent->h_addr_list[0],
pHostent->h_length);
address.sin_port=htons(1234);
err=bind(m_s,(struct sockaddr *)&address,sizeof(address));
if (err!=0)
::MessageBox(NULL,"Bind socker error!","Loopback",MB_OK);
ZeroMemory(&m_to,sizeof(m_to));
m_to.sin_family=AF_INET;
m_to.sin_addr.s_addr=inet_addr(g_strIP);
bStart=1;
bStartSend=TRUE;
::AfxBeginThread(_SendMsgUdpThread,this);
}
else
{
closesocket(m_s);
bStart=0;
KillTimer(101);
}
}
void CRemoteSimDlg::SendMyMessage()
{
static unsigned short sn=0;
static unsigned int timeStamp=0;
m_Message.dataLen=m_nLength+sizeof(struct RTPHEADER);
m_Message.UNION.rtpData.rtpHeader.sn=htons(sn);
m_Message.UNION.rtpData.rtpHeader.timestamp=htonl(timeStamp);
timeStamp++;
sn++;
int rtCode;
rtCode=sendto(m_s,(char *)(m_Message.UNION.data),m_Message.dataLen,
0,(struct sockaddr *)&m_to,sizeof(m_to));
if (rtCode==-1||rtCode!=m_Message.dataLen)
g_PacketLost++;
else
g_PacketReceived++;
}
UINT _SendMsgUdpThread(LPVOID lparam)
{
CRemoteSimDlg *pDlg=(CRemoteSimDlg *)lparam;
while(pDlg->bStartSend)
{
pDlg->SendMyMessage();
}
return 0;
}
//结构定义
#pragma pack(push,1)
struct MPEGIPHEADER{
unsigned char hdLen:4;
unsigned char ver:4;
unsigned char tos;
unsigned short totalLen;
unsigned short flag;
unsigned short offset:13;
unsigned short offsetflag:3;
unsigned char ttl;
unsigned char protocol;
unsigned short crc;
unsigned long srcAdr;
unsigned long dstAdr;
};
struct RTPHEADER
{
unsigned char cc:4;
unsigned char p:1;
unsigned char x:1;
unsigned char v:2;
unsigned char pt:7;
unsigned char m:1;
unsigned short sn;
unsigned int timestamp;
unsigned int ssrc;
};
struct RTPDATA{
struct RTPHEADER rtpHeader;
unsigned char data[MPEG_SEND_BUFFER_SIZE-sizeof(struct RTPHEADER)];
};
#pragma pack(pop)
typedef struct MPEGSENDMESSAGE
{
union{
struct RTPDATA rtpData;
unsigned char data[MPEG_SEND_BUFFER_SIZE];
}UNION;
int dataLen;
}MPEGSENDMESSAGE,*PMPEGSENDMESSAGE;