读书人

使用select,再accept得到10045异常了

发布时间: 2012-02-13 17:20:26 作者: rapoo

使用select,再accept得到10045错误了
//局域网广播的程序

C/C++ code
#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);    }}


//接收广播消息的程序,
C/C++ code
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();} 



[解决办法]
10045:参考的对象类型不支持尝试的操作。

代码没看
[解决办法]
楼主的协议用的好像是UDP协议
我原来也是在UDPserver中用accept出线这样的错误
UDP的写法和TCP应该是有差别的,sendto recvfrom包括似乎不需要用accept
呵呵,我也不是很熟悉。楼主自己检查一下
[解决办法]
第一windows有效端口号好像是1024--65534(我们能bind的)
第二对UDP的接收发送有专用的API,sendto,recvfrom

读书人网 >VC/MFC

热点推荐