MaximalTraffic



  • Grüße !

    Ich transportiere binarisierte Schwellwertbilder einer Zeilenkamera über
    Ethernet -Karten hier verwende ich direkt das Socket32 Gerät.
    Alle Daten werden mit Zip Komprimiert. (schalter BESTSPEED)

    Ich habe nun neue Netzwerkarten(NetGear Gigabit) mit einen Router von
    (NetGear Gigabit) alles in einem "geschlossenen System" Meßgerät.

    Bei einem normalen Filetransfer komme ich auf 11~MB/s Das entspricht
    dem 1GBit/s Wie kann ich meinen Datentransfer nun auf der
    Softwareseite steigern. Ich komme auf ca 4MB/s.

    hier meine wieder im bau befindliche WinSock32 Initialisierung:

    bool CMySock::Create(int ListPort,SOCKCALLBACK pC,DWORD UserDat)
    {
    	Delete();
    
    	m_pcallback  = pC;
        m_UserDat    = UserDat;
    
        if((m_sock = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
        {
            WSACleanup();
            return false;
        }
    
        int DatMax  = 4096,timeout = 1500, NoDly   = 0;
    
        if(setsockopt(m_sock,SOL_SOCKET,TCP_NODELAY,(char *)&NoDly,sizeof(int)) == SOCKET_ERROR)
    	 return false;
    
        if(setsockopt(m_sock,SOL_SOCKET,SO_RCVBUF,(char *)&DatMax,sizeof(int)) == SOCKET_ERROR)
    	 return false;
    
        if(setsockopt(m_sock,SOL_SOCKET,SO_SNDBUF,(char *)&DatMax,sizeof(int)) == SOCKET_ERROR)
    	 return false;
    
        if(setsockopt(m_sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(int)) == SOCKET_ERROR)
         return false;
    
    	if(setsockopt(m_sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(int)) == SOCKET_ERROR)
         return false;
    
    	DWORD iMode = 1; ioctlsocket(m_sock, FIONBIO,&iMode);
    
    	if(ListPort)
    	{
    		SOCKADDR_IN sin;
    		sin.sin_family      = PF_INET;
    		sin.sin_port        = htons(ListPort);
    		sin.sin_addr.s_addr = INADDR_ANY;
    
    		if(bind(m_sock,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)
    		{
    			Delete();
    			return false;
    		}
    
    		if(listen(m_sock, 2) == SOCKET_ERROR)
    		{
    			Delete();
    			return false;
    		}
    
    		m_AccThread.Start(Accept,this,THREAD_PRIORITY_NORMAL);
    	}
    
    	if(pC && UserDat)
    	 m_RecThread.Start(Receive,this,THREAD_PRIORITY_ABOVE_NORMAL);
    
        return true;
    }
    

    Mein Reciever Thread lässt ein Sleep(1) stehen um rechenzeit zurück zu geben.
    Das müßte doch auch über das Timeout von Recieve möglich sein ?

    DWORD CMySock::Receive(LPVOID pParam)
    {
    	CThread *pTh((CThread *)pParam);
        CMySock *pC((CMySock *)pTh->GetClientData());
    
    	char *pMem(0);
    	struct sockaddr_in incaddr;
    	int addrlen(sizeof(incaddr)),len(sizeof(int)),DatMax(0);
        getsockopt(pC->m_sock,SOL_SOCKET,SO_RCVBUF,(char *)&DatMax,&len);
    
    	if(DatMax > 0 && (pMem = new char[DatMax+1]))
    	{
    		while(!pTh->IsEnding())
    		{
    			Sleep(1);
    
    			for(LstSock::iterator it = pC->m_lstsock.begin(); it != pC->m_lstsock.end(); it++)
    			{ 
    				int rVal = recvfrom( (*it)->GetSocket(), (char *)pMem, DatMax,0,(struct sockaddr *)&incaddr,&addrlen);
    				if(rVal == SOCKET_ERROR)
    				{
    					switch(WSAGetLastError())
    					{
    					   case WSAENOTCONN://socket not connected
    					   case WSAESHUTDOWN://socket has been shut down!
    					   case WSAEDISCON:
    					   case WSAEWOULDBLOCK:
    						    break;
    					   case WSAENETRESET:
    					   case WSAECONNABORTED:
    					   case WSAECONNRESET:
    					   case WSAEINVAL:
    					   default:
    						    break;
    					}
    
     				}else if(rVal > 0) 
    				{
    				  if(pC->m_pcallback)	
    				   *(pMem+rVal) = 0,pC->m_pcallback( pMem, rVal, pC->m_UserDat,(*it)); 
    				}else 
    				{
    				  (*it)->Delete(); delete (*it); 
    				  it = pC->m_lstsock.erase(it);
    				  break;
    				}
    			}
    		}
    
    		delete pMem;
    	}
    
    	pTh->SetEnding();
    
    	return 0;
    }
    

    Danke für Hinweise.
    grüße Karsten Schulz
    www.kahnsoft.de


Anmelden zum Antworten