使用select,再accept得到10045错误了
//局域网广播的程序
#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();}