//局域网广播的程序#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>
#include <time.h>
#include <stdio.h>
 int init_socket_library()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if (err!=0)
{
return SOCKET_ERROR;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) 
{
/* Tell the user that we could not find a usable */
/* WinSock DLL.   */
WSACleanup();
return SOCKET_ERROR;
}
return 0; 
}
 SOCKET m_socket;
 int binding()
 {
 m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
 if (m_socket==INVALID_SOCKET)
 {
 return -1;
 }
 
 //Set no-blocking 
 ULONG flages=1;
 if (ioctlsocket(m_socket,FIONBIO,&flages)==-1)
 {
 return -1;
 }
 
 //Set broadcasting
 bool boptionvalue=true;
 if (setsockopt(m_socket,SOL_SOCKET,SO_BROADCAST,(char*)&boptionvalue,sizeof(bool))==-1)
 {
 return -1;
 }
 
 sockaddr_in address;
 memset(&address,0,sizeof(sockaddr_in));
 address.sin_family=AF_INET;
 address.sin_addr.s_addr=htonl(INADDR_ANY);
 while (1)
 {
 srand( (unsigned)time( NULL ) );
 ULONG port=rand()%10000;
 address.sin_port=htons(port);
 if ( bind(m_socket,(sockaddr*)&address,sizeof(address))!=SOCKET_ERROR  )
 {
 break;
 }
 }
 return 0;
 
}
int main()
{
init_socket_library();
binding(); sockaddr_in address;
memset(&address,0,sizeof(sockaddr_in));
address.sin_family= AF_INET;
address.sin_port=htons(1133);//端口
address.sin_addr.s_addr=0xffffffff;//INADDR_BROADCAST
char buffer[1024];
memset(buffer,0,1024);
memcpy(buffer,"abcd",sizeof("abcd"));
int len=sizeof(address);
while(true)
{
if (sendto(m_socket,buffer,sizeof(buffer),0,
(struct sockaddr*)&address,len)==SOCKET_ERROR)
{
printf("sendto error%d\r\d",GetLastError());
}
Sleep(100);
}
}
//接收广播消息的程序,communication::communication(void)
{
m_socket=INVALID_SOCKET;
init_socket_library();
binding();
DWORD threadID;
m_thread=CreateThread(NULL,0,LPTHREAD_START_ROUTINE(&ThreadProc),
this,0,&threadID);
}communication::~communication(void)
{
}void __stdcall communication::ThreadProc(LPVOID lpParameter)
{
// return ;
communication *m_commu=(communication*)lpParameter;
printf("Thread started\r\n");
sockaddr_in temp_address;
memset(&temp_address,0,sizeof(temp_address));
int address_length=sizeof(temp_address);
fd_set fd_read,fd_write;
timeval tmval;
tmval.tv_sec=2;
tmval.tv_usec=0; listen(m_commu->m_socket,63);
while ( true)
{
FD_ZERO(&fd_read);//将读清零
FD_ZERO(&fd_write);//将写清零 FD_SET(m_commu->m_socket,&fd_read);
if ( select(0,&fd_read,&fd_write,NULL,&tmval)!=SOCKET_ERROR)
{
if (FD_ISSET(m_commu->m_socket,&fd_read))
{//有新的连接到来
SOCKET temp_socket=accept(m_commu->m_socket,
( sockaddr*)&temp_address,&address_length);
// printf("%s is incoming\r\n",inet_ntoa(temp_address.sin_addr));
printf("%d\r\n",GetLastError());//返回得到10045错误
if (temp_socket!=INVALID_SOCKET)
{
ULONG flages=1;
if (ioctlsocket(temp_socket,FIONBIO,&flages)!=SOCKET_ERROR )
{
m_commu->m_client_socket_list.push_back(temp_socket);
printf("%s is incoming\r\n",inet_ntoa(temp_address.sin_addr));
}

}
}
}
FD_ZERO(&fd_read);//将读清零
list<SOCKET>::const_iterator it;
for (it=m_commu->m_client_socket_list.begin();it!=m_commu->m_client_socket_list.end();++it)
{
FD_SET(*it,&fd_read);
} if ( select(0,&fd_read,NULL,NULL,&tmval)!=SOCKET_ERROR )
{
for (it=m_commu->m_client_socket_list.begin();it!=m_commu->m_client_socket_list.end();++it)
{
if ( FD_ISSET(*it,&fd_read) )
{//接收数据
char recvbuff[1025];
memset(recvbuff,0,sizeof(recvbuff));
// recvfrom(*it,recvbuff,sizeof(recvbuff),)
recv(*it,recvbuff,sizeof(recvbuff),0);
printf("recv buffer:%s\r\n",recvbuff);
}
}
} Sleep(100);
}
}int communication::init_socket_library()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData );
if (err!=0)
{
return SOCKET_ERROR;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) 
{
/* Tell the user that we could not find a usable */
/* WinSock DLL.   */
WSACleanup();
return SOCKET_ERROR;
}
return 0; 
}
int communication::binding()
{
m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
if (m_socket==INVALID_SOCKET)
{
return -1;
} //Set no-blocking 
ULONG flages=1;
if (ioctlsocket(m_socket,FIONBIO,&flages)==-1)
{
return -1;
} //Set broadcasting
bool boptionvalue=true;
if (setsockopt(m_socket,SOL_SOCKET,SO_BROADCAST,(char*)&boptionvalue,sizeof(bool))==-1)
{
return -1;
} sockaddr_in address;
memset(&address,0,sizeof(sockaddr_in));
address.sin_family=AF_INET;
address.sin_addr.s_addr=htonl(INADDR_ANY);
while (1)
{
srand( (unsigned)time( NULL ) );
ULONG port=rand()%10000;
port=1133;////////////先指定port
address.sin_port=htons(port);
if ( bind(m_socket,(sockaddr*)&address,sizeof(address))!=SOCKET_ERROR  )
{
break;
}
}
return 0;}
void communication::clear_socket_library()
{
WSACleanup();
}

解决方案 »

  1.   

    楼主的协议用的好像是UDP协议
    我原来也是在UDPserver中用accept出线这样的错误
    UDP的写法和TCP应该是有差别的,sendto recvfrom包括似乎不需要用accept
    呵呵,我也不是很熟悉。楼主自己检查一下
      

  2.   

    第一windows有效端口号好像是1024--65534(我们能bind的)
    第二对UDP的接收发送有专用的API,sendto,recvfrom
      

  3.   

    原来UDP不能使用accept,看来我的设计还得修改