纠结了一天多的DHCP包发送问题得以解决,在修改了整个程序的设计模式后,将原来各种数据包分别发送,改为了一个专门发送数据包的类和另一个专门处理数据包的类,然后就感觉程序修改起来尤其容易~~
言归正传,今天的主要问题是使用socket进行广播,但是报出错误码:10013。通过查询知道这个问题是有趣权限不够的原因引起的,但是,接触socket到现在,我还从来没有听说过socket中还有什么权限问题,囧||。
问了同事大哥后,才知道原来是一个叫做setsockopt的函数作祟。修改之后,空的dhcp数据包就能够成功发送了~~~O(∩_∩)O
实现代码:
if(clientsocket==INVALID_SOCKET) //套接字创建失败
{
cout<<"Invalid socket"<<endl;
WSACleanup();
return false;
}
//配置协议簇
clientsock_in.sin_family=AF_INET;
clientsock_in.sin_addr.S_un.S_addr=htonl(INADDR_BROADCAST);
clientsock_in.sin_port=htons(DHCPSENDPORT);
if(connect(clientsocket,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR))==SOCKET_ERROR) //建立连接
{
cout<<"failed to connect."<<endl;
closesocket(clientsocket);
WSACleanup();
return false;
}
cout<<"ip:"<<inet_ntoa(clientsock_in.sin_addr)<<endl;
cout<<"port:"<<ntohs(clientsock_in.sin_port)<<endl;
int err=sendto(clientsocket,(char*)&package,sizeof(package),0,(SOCKADDR*)&clientsock_in,sizeof(SOCKADDR_IN)); //数据包传输
if(err==SOCKET_ERROR) //数据传输错误
{
DWORD res=WSAGetLastError();
cout<<"传输发生错误:"<<res<<endl;
closesocket(clientsocket);
WSACleanup();
return false;
}
cout<<"数据包发送成功!"<<endl;
closesocket(clientsocket);
return true;
}
运行结果:
用wireshark抓包如下: