Solved

Communication port stop working under windowsNT

Posted on 1998-05-11
13
320 Views
Last Modified: 2013-11-20
When I write/read to/from the communication port simultaneous ( using WriteFile/ReadFile API functions ), after a while it stop working ( the com port stop transmite data ).
more information :

1) This happen only on some computers while on anothers it not happen.

2) When running under Win95 then no problem ( on any commputer). i.e. this may happen on some computers under WindowsNT

3) When I write/read/to/from the communication port not simultaneous (write to port, wait to answer, write again and so on) then no problem

4) The communication is done with DSP card  (RS232 link)

5) When the communication port stop responding I have to reopen it ( i.e. close it with CloseHandle, and open it again with OpenFile) , and thenit continue working till the next fail

6) I open the communication port with OpenFile function in I/O Overlap Mode
0
Comment
Question by:avrahaml
  • 7
  • 5
13 Comments
 
LVL 1

Expert Comment

by:Blondie050798
ID: 1309808
Well you could be overflowing...you can try using a buffer window.
0
 
LVL 4

Accepted Solution

by:
piano_boxer earned 100 total points
ID: 1309809
It could be caused by a communication error not reset. Try inserting ClearCommError before reading or writing.
Or, If the port is opened for overlapped operations you need to make ovelapped calls (using a OVERLAPPED structure) in every read or write (this is nessecary under Windows NT).
0
 

Author Comment

by:avrahaml
ID: 1309810
I use  ClearCommError each read/write. I supplied to the ReadFile/WriteFile functions the  OVERLAPPED  structure and wait to event ( with WaitForSingleObject ) and  the problem exist.   Your answer dont explain why it happen only in WindowsNT ( and not Win95 ) and why on some computers the problen not happen at all.
0
 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309811
Nope!
0
 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309812
One other thing, do you initialize the OVERLAPPED structure correctly (zero-ing it at setting hEvent)?
0
 

Author Comment

by:avrahaml
ID: 1309813
Yes,  i initialize the OVERLAPPED structure ( stior):

stior.hEvent=readevent;
stior.Offset=0;
stior.OffsetHigh=0;

0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309814
Hmm....

The there must be a problem in your read/write routine. Could you post the code here?
0
 

Author Comment

by:avrahaml
ID: 1309815
Here is a test program . It send a message of 12 bytes to the port and ecpect to get 5 bytes answer back. If it not get answer after timeout it print "No Ans" in the main window otherwize it print the 5 bytes answer  message in blue.


#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>                  // MFC support for Windows 95 Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT

#define DY 12      // font width
#define DX 8       // font hight
#define MAXPIPE 8 // max pipeline level of the main tread
#define PRRATE 7  // window msg update rate

#define STARTADD 0x02850c
#define ENDADD   0x029000

#define MAXACCESSCOM 7

#define MAXPMSG 20
#define PRMSG WM_USER+1000

#define RCTO32(buf)  buf[5]+(buf[6]<<8)+(buf[3]<<16)+(buf[4]<<24);
void purecom();
void  putcsum(BYTE *buf);
#define HELP pw->printWnd(1,14,0,"c- clear errors, t- reset time, c- show set up, h-init com driver");


//====================================================================
//====================== classes =====================================
//====================================================================

//***************** THE MAIN APPLICATION ********
class myapp : public CWinApp
{

public:  
myapp();
~myapp();
BOOL OnIdle( LONG lCount );
virtual BOOL InitInstance();
virtual int  ExitInstance( );
void CloseComPort();
void OpenComPort();

};
//***************** The one and only myapp object
myapp theApp;
//********************* declare myindow class **************
class mainWin : public CFrameWnd
{
HFONT hf;
COLORREF c1,c2,c3,cerr,cok;
void printWnd(int x,int y, COLORREF color, char * text);

protected:
LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
public:
mainWin();
~mainWin();
friend myapp;
friend UINT reciver(LPVOID pParam );
};

//====================================================================
//---------------- global variables ----------------------------------------------------
//====================================================================

mainWin * pw; // pointer to the main window

DWORD brntab[11]={{CBR_1200},{CBR_2400},{CBR_4800},{CBR_9600},{CBR_19200},{CBR_38400},
{CBR_56000},{CBR_57600},{CBR_115200},{CBR_128000},{CBR_256000}};

// global variables of the communications

int timeout=50;
HANDLE hcom=INVALID_HANDLE_VALUE;
int comPort=2;
int br_code=8; // boud rate code
DWORD bmul;    // actual boud rate

HANDLE readevent[2];
HANDLE writeevent;
HANDLE strMutex;
HANDLE comsemapore;

OVERLAPPED stiow;
OVERLAPPED stior;
//int pipeLevel=0;
int ppl=0;

char str1[MAXPMSG][120];
char str2[MAXPMSG][120];
int ps=0;
int timec=0,timed=0,num=0;;
DWORD noans=0,err=0,numerr=0,csumerr=0;

int brk=0;
//int Tnoans=0;
int rate=0;
DWORD add=STARTADD;
BOOL stopScan=FALSE;
char strcom[50];

BYTE trbufs[12]={0xaa,11,0x00,0x01,0x02,0x85,0x41,0x00,0x00,0x00,0x00,0x00}; // transmite buffer set
int data=0;

#define SLSET 0

DWORD addfclk=0x02850c;


COMMTIMEOUTS timeo;  
DCB comdc;  


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++ TREAD functins ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



//********************** clear pipi *********************
void clearpipe()
{//int n;
DWORD nw;
  ppl=0;
  rate=PRRATE;
  Sleep(150);
    purecom();
  Sleep(50);
    purecom();
  Sleep(450);
  if(!stopScan)WriteFile(hcom,trbufs,12,&nw,&stiow); ++ppl;
}


//******************* write to com buffer *********************
void writecom( BYTE *buf, int num)
{DWORD nw;

DWORD comerr;
ClearCommError(hcom,&comerr,NULL);

WriteFile(hcom,buf,num,&nw,&stiow);
//WaitForSingleObject(writeevent,2000);
++ppl;

}
//******************** reciver function tread *********************************************
UINT reciver(LPVOID pParam )
{DWORD nw; BYTE rcbuf[20]; int sr,numb,n;  BYTE sum;
char str[150];
DWORD comerr;
COLORREF cpr;
while(hcom!=INVALID_HANDLE_VALUE){


while(stopScan){Sleep(10); }

      if(ppl<0) return(1);
ReadFile(hcom,rcbuf,2,&nw,&stior);
sr=WaitForMultipleObjects(2,readevent,FALSE,timeout); // wait for answer till timeout

      trbufs[7]=data>>16;
      trbufs[8]=data>>24;
      trbufs[9]=data;
      trbufs[10]=data>>8;
      ++data;                

      putcsum(trbufs);

        if(ppl<MAXPIPE)       { writecom(trbufs,12); }
        if(ppl<MAXPIPE)       { writecom(trbufs,12); }


if(sr!=WAIT_FAILED && sr!=WAIT_TIMEOUT ){
            if(ppl<0) return(1);

    if(rcbuf[1]>0 &&rcbuf[1]<=11){
      ReadFile(hcom,&rcbuf[2],rcbuf[1]-1,&nw,&stior);
    sr=WaitForMultipleObjects(2,readevent,FALSE,timeout);
                                  }
                                        }

++num;
if(sr==WAIT_TIMEOUT){
  ++noans;
  goto enderr;
                    }
  ClearCommError(hcom,&comerr,NULL);
  if(comerr){
        ++err;
        goto enderr;
            }
  numb=rcbuf[1];
  if(numb>11 ||numb<1) {
        ++numerr;
        goto enderr;
                      }
  sum=0;
  for(n=0;n<numb;n++)sum+=rcbuf[n];
  if(sum!=rcbuf[numb]){
        csumerr++;
        goto enderr;
                     }


if(++brk>500){Sleep(1);brk=0;}
//Tnoans=0;
for(n=0;n<=numb;n++)sprintf(&str[3*n],"%02x            ",rcbuf[n]);

//b=rcbuf[2] &0x1f;
/*
if(b!=0x00 ){
  clk=RCTO32(rcbuf);
  if(timed==0)timed=clk;
  else timec+=clk-timed;
  timed=clk;
  if(pipeLevel>0)--pipeLevel;
  SetEvent(rcevent[b]);
            }
*/
if(ppl>0)  --ppl;
cpr=pw->cok;
goto end;

enderr:
  sprintf(str,"No ANS                   ");
  cpr=pw->cerr;
  clearpipe();

end:
 //    } // close else (i.e. no time out )

if(++rate>=PRRATE){
WaitForSingleObject(strMutex,INFINITE);
//  sprintf(str2[ps],"%ld: Pipe level %ld %ld,  No ans: %ld, errors: %ld   time: %g    ",num,pipeLevel,ppl,noans,err,timec/20000.0);
  sprintf(str2[ps],"%ld: Pipe level  %ld,  No ans: %ld, errors: %ld %ld %ld     ",num,ppl,noans,err,numerr,csumerr);
  strcpy(str1[ps],str);

ReleaseMutex(strMutex);
  pw->PostMessage(PRMSG,ps,cpr);
  if(++ps>=MAXPMSG)ps=0;
  rate=0;
                  }
                                 }
return(0);
}

//---------- some global functions -----------------




//***************************** print last system error ****************************************
void prlasterr(char *title,DWORD sign=0)
{LPVOID lpMsgBuf;
FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL );
MessageBeep(MB_OK);
MessageBox(NULL,(char *)  lpMsgBuf,title,MB_OK|MB_APPLMODAL|MB_TOPMOST|sign);
LocalFree( lpMsgBuf );
}



//************ putchecksum ***************************************************************************************
void  putcsum(BYTE *buf)
{int n;BYTE sum=0;
int num=buf[1];
for(n=0;n<num;n++)sum+=buf[n];
buf[num]=sum;
}

//***************** Communication function Low level envalope ********************************
void purecom()
{ DWORD sb;
//if(Tnoans)return;

sb=PurgeComm(hcom,PURGE_RXCLEAR | PURGE_RXABORT | PURGE_TXABORT | PURGE_TXCLEAR); // flush the read channel
//sb=PurgeComm(hcom,PURGE_RXCLEAR | PURGE_TXCLEAR); // flush the read channel

if(!sb){prlasterr("Clear read buffer fail");}
//DCB comdc;  
//GetCommState(hcom,&comdc);
//SetCommState(hcom,&comdc);  
}






//====================================================================
//====================== mainWin functions ==========================
//====================================================================

//************* mainWin constructor *********************************
mainWin::mainWin()
{int n;
hf=CreateFont(DY,DX,0,0,0,0,0,0,OEM_CHARSET,0,0,0,FIXED_PITCH,NULL);
c1=RGB(0,0,0);
c2=RGB(0,100,0);
c3=RGB(0,0,100);
cerr=RGB(255,0,0);
cok =RGB(0,0,255);
//putcsum(trbuf); // add check sum to the tr buffer end
//readevent=CreateEvent(NULL,FALSE,FALSE,NULL);
//if(readevent==NULL)prlasterr("Fail to create read event handle");

for(n=0;n<2;n++) {
readevent[n]=CreateEvent(NULL,FALSE,FALSE,NULL);
if(readevent[n]==NULL)prlasterr("Fail to create read event handle");
                 }

writeevent=CreateEvent(NULL,FALSE,FALSE,NULL);
if(writeevent==NULL)prlasterr("Fail to create write event handle");


strMutex=CreateMutex(NULL,FALSE,NULL);
if(strMutex==NULL)prlasterr("Fail to create pipe mutex");

comsemapore=CreateSemaphore(NULL,MAXACCESSCOM,MAXACCESSCOM,NULL);
if(comsemapore==NULL)prlasterr("Fail to create comsemapore handle");


stiow.hEvent=writeevent;
stiow.Offset=0;
stiow.OffsetHigh=0;

stior.hEvent=readevent[0];
stior.Offset=0;
stior.OffsetHigh=0;


}
//************* mainWin distructor **********************************
mainWin::~mainWin()
{//int n;
theApp.CloseComPort();

DeleteObject(hf);
//CloseHandle(readevent);
CloseHandle(readevent[0]);
CloseHandle(readevent[1]);
CloseHandle(writeevent);


CloseHandle(comsemapore);

CloseHandle(strMutex);

}

//******************* print on window ********************************
void mainWin::printWnd(int x,int y, COLORREF color, char * text)
{HDC dc; HFONT hfd;
dc =::GetDC(m_hWnd);
SetTextColor(dc,color);
SetTextAlign(dc,TA_TOP|TA_LEFT);
hfd= (HFONT)SelectObject(dc,hf);
TextOut(dc,x*DX,y*DY,text,strlen(text));
(HFONT)SelectObject(dc,hfd);
::ReleaseDC(m_hWnd,dc);
}

//************** Virtual function WindowProc Proccess user events ***************
LRESULT mainWin::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
{  char tmp[100];
if (message==WM_KEYDOWN) //********** special or normal  key pressed
   {
   }
else if (message== WM_CHAR)    //********** only normal key pressed,
   {
 switch(wParam){


  case 'c':
        sprintf(tmp,"port %ld:  boud: %ld, timeout: %ld  ",comPort,brntab[br_code],timeout);
        printWnd(1,1,c1,tmp);
        HELP
        break;
  case 't':
        timec=0;
        timed=0;
        num=0;
        break;
  case 'r':
        noans=0;
        csumerr=0;
        numerr=0;
        err=0;
        break;
  case 'h':
      stopScan=TRUE;
        Sleep(200);
        printWnd(1,6,c2,"Stop communication                   ");
        clearpipe();
        CloseHandle(hcom);
        Sleep(100);
      hcom=CreateFile(strcom,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
              FILE_FLAG_OVERLAPPED|FILE_FLAG_WRITE_THROUGH,NULL);
      SetCommState(hcom,&comdc);  // attach the comdc struct to the com handle
      SetCommTimeouts(hcom,&timeo); // set the time out for the comm

        stopScan=FALSE;
      break;  


               }
      }
else if(message==PRMSG){
WaitForSingleObject(strMutex,INFINITE);
  pw->printWnd(1,6,lParam, str1[wParam]);
  pw->printWnd(1,8,c2, str2[wParam]);
ReleaseMutex(strMutex);
                    }

return(CWnd::WindowProc( message, wParam, lParam ));
 }

//======================= application functions =======================
//**************** CTestApp construction
myapp::myapp(){}
//**************** CTestApp destructor
myapp::~myapp(){}

//******************* the loop action *****************
BOOL myapp::OnIdle( LONG lCount )
{
  return(1);
}


//-******************* open communication *************************************************
void myapp::OpenComPort()
{
char str[100];
BOOL st;

if(hcom!=INVALID_HANDLE_VALUE)return;


timeo.ReadIntervalTimeout=         timeout;        
timeo.ReadTotalTimeoutMultiplier=  timeout;        
timeo.ReadTotalTimeoutConstant=    MAXWORD;      
timeo.WriteTotalTimeoutMultiplier= MAXWORD;    
timeo.WriteTotalTimeoutConstant=   MAXWORD;    


bmul=brntab[br_code];

sprintf(strcom,"COM%d",comPort);

hcom=CreateFile(strcom,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);

if(hcom==INVALID_HANDLE_VALUE){
      sprintf(str,"Cannot open communication port: COM%d ",comPort);
    prlasterr(str,MB_ICONSTOP);
      goto end;
                              }

else {
st=GetCommState(hcom,&comdc);
if(!st){prlasterr(" Get communication structure Error");goto end;}

comdc.DCBlength=sizeof(DCB);
comdc.wReserved=0;
comdc.fAbortOnError=0;
comdc.fParity=1; // enable parity check

sprintf(str,"baud=%d parity=E data=8 stop=1",bmul);
st=BuildCommDCB(str,&comdc); // bulid the structure comdc ,used by SetCommState
if(!st){prlasterr(" Set communication structure Error");goto end;}
st=SetCommState(hcom,&comdc);  // attach the comdc struct to the com handle
if(!st){ prlasterr(" Set communication Error"); }
else{st=SetupComm(hcom,2000,2000);  // set up the buffer size for the comm
if(!st){ prlasterr("Fail to alocate buffres"); goto end; }
if(st)SetCommTimeouts(hcom,&timeo); // set the time out for the comm
else{ prlasterr(" Set communication time out structure Error");}
       }
     }



AfxBeginThread(reciver,NULL,THREAD_PRIORITY_NORMAL);  // create thread object

SetCommMask(hcom,EV_TXEMPTY);


end:
return;
}


//-******************* Close communication *************************************************

void myapp::CloseComPort()
{ HANDLE h=hcom;
ppl=-10000;
hcom=INVALID_HANDLE_VALUE;
Sleep(500);
CloseHandle(h);
Sleep(200); // wait till treads terminates
}
/////////////////////////////////////////////////////////////////////////////
// CTestApp initialization
BOOL myapp::InitInstance()
{
RECT winpos={20,20,700,250};//SCROLLINFO psb;// HDC dc;
#ifdef _AFXDLL
      Enable3dControls();                  // Call this when using MFC in a shared DLL
#else
      Enable3dControlsStatic();      // Call this when linking to MFC statically
#endif

      LoadStdProfileSettings();  // Load standard INI file options (including MRU)
//classreg(&mainclass,&brmain,CBM,mainname,mainhandmsg,IDI_KS_ICO,IDC_VARS_CUR);
m_pMainWnd =(mainWin *) new mainWin();
if(m_pMainWnd==NULL)return FALSE;
if(!((mainWin *)m_pMainWnd)->Create(NULL,"TT RS232 duplex communication, rev 9.2 (c++ 5.0)",WS_OVERLAPPEDWINDOW,winpos))
      return FALSE;

pw=(mainWin *)m_pMainWnd;
pw->ShowWindow(m_nCmdShow);


if(m_lpCmdLine[0]!='\0'){
sscanf(m_lpCmdLine,"%ld",&comPort);
comPort=min(comPort,2);
comPort=max(comPort,1);
                      }



OpenComPort();
pw->WindowProc(WM_CHAR,'c',0 ); // print communication status

HELP

return(TRUE);
}

//********** exit application *****************
int myapp::ExitInstance( )
{
return(CWinApp::ExitInstance());
}






0
 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309816
I cannot simply say what is wrong, but I must say that you are
doing things a little bit wierd here.

1. When doing a overlapped read the read _CAN_ be completed by the ReadFile call,
   so you need to check the return value of ReadFile().
   If ReadFile returns TRUE the the operation has completed compleatly by the ReadFile call.

2. If the ReadFile call returns FALSE and GetLastError() == ERROR_IO_PENDING
   the the read is pending and you should wait for the hEvent signal to be set (as you do).
   BUT, in order to get the result of the overlapped operation, you need to call GetOverlappedResult()
   which will return TRUE if the function completed successfully
   and also returns number of bytes transmitted.

3. You should use a manual reset event for overlapped operations.
   Plz note that i manually resets this event because of a bug
   in Windows 95!

4. Its not clear to me why you use all those Sleep() commands.
   Would'nt it be better to user events instead?


---
Here is a sample of how I implemented the reading thread:

// Initialize overlapped struct
OVERLAPPED ol;
ZeroMemory(&ol, sizeof(ol));
ol.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

BYTE rgBuf[256];
int nPos = 0;


//
// Insert code to open COMPORT here
//

// Setup timeout values
// The read will complete when there is >100 ms between to chars.
// But block forever untill at least 1 char is received.
COMMTIMEOUTS ctmo;
ctmo.ReadIntervalTimeout = 100;
ctmo.ReadTotalTimeoutMultiplier = MAXDWORD;
ctmo.ReadTotalTimeoutConstant = MAXDWORD;
ctmo.WriteTotalTimeoutMultiplier = MAXDWORD;
ctmo.WriteTotalTimeoutConstant = MAXDWORD;

VERIFY(SetCommTimeouts(hPort, &ctmo));


// Run forever
while(1)
{
    DWORD dwBytesRead;
   
    ResetEvent(ol.hEvent); // Reset event manually because of bug in Windows 95 !!!!

    // Read a many bytes as the inputbuffer can hold
    if( ReadFile(hPort, &rgBuf[dwPos], sizeof(rgBuf)-dwPos, &dwBytesRead, &ol) )
    {
        dwPos += dwBytesRead;
        if(dwPos > BYTES_NEEDED)
        {
            // Do something with the data.
           
            dwPos = 0;
        }
    }
    else if( GetLastError() == ERROR_IO_PENDING)
    {
        // Wait for overlapped operation to complete and
        // get result.
        if(WaitForSingleObject(ol.hEvent, TIMEOUT_VALUE) != WAIT_OBJECT_0)
        {
            // Proberly timeout
            TRACE("timeout\n");
            dwPos = 0;
        }
        else
        {
            if(GetOverlappedResult(hPort, &ol, &dwBytesRead, TRUE))
            {
                dwPos += dwBytesRead;
                if(dwPos > BYTES_NEEDED)
                {
                    // Do something with the data.
           
                    dwPos = 0;
                }
            }
            else
            {
                DWORD dwError;
                ClearCommError(hPort, &dwError, NULL);
                TRACE("Error\n");
                dwPos = 0;
            }
        }

    }
    else
    {
        DWORD dwError;
        ClearCommError(hPort, &dwError, NULL);
        TRACE("Error\n");
        dwPos = 0;
    }
}

0
 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309817
Sorry, int nPos = 0; should be: DWORD dwPos=0;
0
 
LVL 4

Expert Comment

by:piano_boxer
ID: 1309818
Damn! Everything goes wrong for me today.

The lines dwPos > BYTES_NEEDED should have been dwPos >= BYTES_NEEDED.
0
 

Author Comment

by:avrahaml
ID: 1309819
I fix the program according to your suggestions and it seems that it not help. I see that in your example you dont have write action to the port which to my opinion have something to do with the problem.
however  I continue tol check your suggestions, and do other tests.
0
 

Author Comment

by:avrahaml
ID: 1309820
I still not solve the problem. I  still serch the problem source.
Anyway  your comments help me to improve my code. If you ( or somebody elese ) have more ideas, or now about anybody else that has
similar problem I will be greatfull.
I will reply latter to close this issue.
0

Featured Post

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Generic progress indicator 6 110
sameEnds challenge 3 107
ShiftLeft challenge 21 66
wordmultiple challenge 12 93
Introduction: Load and Save to file, Document-View interaction inside the SDI. Continuing from the second article about sudoku.   Open the project in visual studio. From the class view select CSudokuDoc and double click to open the header …
Introduction: Finishing the grid – keyboard support for arrow keys to manoeuvre, entering the numbers.  The PreTranslateMessage function is to be used to intercept and respond to keyboard events. Continuing from the fourth article about sudoku. …
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now