| 发表于:2008-01-25 13:37:376楼 得分:0 |
bool ccommunication::initnetwork(bool btcp, bool budp, int itcpport, int iudpport) { ::initializecriticalsection(&m_csection); m_btcptype = btcp; m_budptype = budp; m_itcpport = itcpport; m_iudpport = iudpport; cstring strerror; if ( m_budptype ) { m_sudpsever = createsever(udp); if ( m_sudpsever == invalid_socket ) { return false; } m_hudpcompletionport = createiocompletionport(invalid_handle_value, null, 0, 0); if ( m_hudpcompletionport == null ) { m_dwerror = getlasterror(); strerror.format("%d", m_dwerror); closehandle(m_htcpcompletionport); afxmessagebox("create udp io completion port fail, error:" + strerror); return false; } char szname[_max_path]; cstring str; int err = gethostname(szname, _max_path); if ( err == socket_error ) { str.format("%d", wsagetlasterror()); } hostent *phostent = gethostbyname(szname); if ( phostent == null ) { afxmessagebox("communication gethostbyname error"); return false; } in_addr addr; memcpy(&addr, phostent-> h_addr_list[0], sizeof(in_addr)); system_info sysinfo; getsysteminfo(&sysinfo); for ( int i = 0; i < 1/*sysinfo.dwnumberofprocessors*2+2*/; i++) { dword workerthreadforudpid; handle hworkerthreadforudp = createthread(null, 0, &workerforudpproc, this, 0, &workerthreadforudpid); if ( hworkerthreadforudp == null ) { m_dwerror = getlasterror(); strerror.format("%d", m_dwerror); closehandle(hworkerthreadforudp); afxmessagebox("create workerthreadforudp thread fail, error:" + strerror); return false; } closehandle(hworkerthreadforudp); } lpperhandledata perhandledataforudp = (lpperhandledata)globalalloc(gptr, sizeof(perhandledata)); sockaddr_in addrfrom; int isize = sizeof(addrfrom); createiocompletionport((handle)m_sudpsever, m_hudpcompletionport, (dword)&addrfrom, 0); dword recvbytes, flag = 0; lpperiohandledata periohandledataforudp = (lpperiohandledata)globalalloc(gptr, sizeof(periohandledata)); memset(&(periohandledataforudp-> overlap), 0, sizeof(overlapped)); periohandledataforudp-> recvdatabuf.buf = periohandledataforudp-> recvbuf; periohandledataforudp-> recvdatabuf.len = pocket_default_size; periohandledataforudp-> itype = recv_data; err = wsarecvfrom(m_sudpsever, &(periohandledataforudp-> recvdatabuf), 1, &recvbytes, &flag, (sockaddr*)&addrfrom, &isize, &(periohandledataforudp-> overlap), null); if ( err == socket_error ) { str.format("%d", wsagetlasterror()); } } return true; } dword winapi workerforudpproc(lpvoid lparam) { int err; cstring strerr; ccommunication* pcommunication = (ccommunication*)lparam; lpperhandledata perhandledata; sockaddr_in addr; lpperiohandledata periohandledata; dword dwrecvbyte = 0; while (true) { bool bsuccess = getqueuedcompletionstatus(pcommunication-> getudpcompletionport(), &dwrecvbyte, (lpdword)&addr, (lpoverlapped*)&periohandledata, infinite); if ( dwrecvbyte == -1 && perhandledata == null ) { return 1l; } if ( dwrecvbyte != 0 && periohandledata-> itype == recv_data ) { pcommunication-> dealdatafromudpcomletionport(perhandledata, periohandledata, dwrecvbyte); dword dwflag = 0; memset(periohandledata-> sendbuf, 0, pocket_default_size); memcpy(periohandledata-> sendbuf, periohandledata-> recvbuf, pocket_default_size); periohandledata-> itype = send_data; periohandledata-> senddatabuf.buf = periohandledata-> sendbuf; periohandledata-> senddatabuf.len = periohandledata-> recvdatabuf.len; memset(periohandledata-> recvbuf, 0, pocket_default_size); memset(&periohandledata-> overlap, 0, sizeof(overlapped)); err = wsasendto(pcommunication-> getudpseversocket(), &(periohandledata-> senddatabuf), 1, &dwrecvbyte, dwflag, (sockaddr*)&addrfrom, sizeof(sockaddr), &(periohandledata-> overlap), null); if ( err == socket_error ) { strerr.format("%d", wsagetlasterror()); } } else if ( dwrecvbyte == 0 && ((periohandledata-> itype == recv_data) ¦ ¦ (periohandledata-> itype == send_data)) ) { //delete client } } return 1l; } 我是这样写的,不知道哪里错掉了。 | | |
|