Home > Software engineering >  CAsyncSocket: : OnReceive receiving data is not complete
CAsyncSocket: : OnReceive receiving data is not complete

Time:10-01

Example implementation from Microsoft's website I found CSocket onReceive receive client socket request

 void CMyAsyncSocket: : OnReceive (int nErrorCode)//CMyAsyncSocket is 
//derived from CAsyncSocket
{
Static int I=0;

i++;

TCHAR buff [4096].
Int nRead;
NRead=Receive (buff, 4096);

The switch (nRead)
{
Case 0:
Close ();
break;
Case SOCKET_ERROR:
If (GetLastError ()!=WSAEWOULDBLOCK)
{
AfxMessageBox (_T (" Error occurred "));
Close ();
}
break;
Default:
Buff [nRead]=_T (' \ 0 ');//the terminate the string
Cstrings szTemp (buff);
M_strRecv +=szTemp;//m_strRecv is a cstrings declared
//in CMyAsyncSocket
If (szTemp.Com pareNoCase (_T (" bye "))==0)
{
ShutDown ();
S_eventDone. SetEvent ();
}
}
CAsyncSocket: : OnReceive (nErrorCode);
}

But in the regional network transmission can be received 1460 bytes at a time when,
I try to cycle the receive the same results
 the while (1) 
{
TCHAR buf [512].
Memset (buf, 0512);

Int len=Receive (buf, 512);

NRead +=len;

Memcpy (buff + nRead - len, buf, len);

If (len!
=512)break;
}


Don't know if you have encountered such a problem
Please give some advice


CodePudding user response:

VC do is less and less

CodePudding user response:

Fyi:
//loop to a function every time send 200 bytes (this is the fixed) buffer, 
//a function need to incoming buffer, the circulation of 240 bytes (fixed) new buffer for processing,
//when dealing with each new printing takes two bytes of the buffer
# ifdef _MSC_VER
# pragma warning (4996) disable:
# endif
# include & lt; Stdio. H>
# include & lt; Stdlib. H>
# include & lt; String. H>
# ifdef _MSC_VER
# include & lt; Windows. H>
# include & lt; Process. H>
# include & lt; IO. H>
# define MYVOID void
# define vsnprintf _vsnprintf
# the else
# include & lt; Unistd. H>
# include & lt; Sys/time. H>
# include & lt; Pthread. H>
# define CRITICAL_SECTION pthread_mutex_t
# define MYVOID void *
# endif
//the Log {
# define MAXLOGSIZE 20000000
# define MAXLINSIZE 16000
# include & lt; Time. H>
# include & lt; Sys/timeb. H>
# include & lt; Stdarg. H>
Char logfilename1 []="MyLog1. Log";
Char logfilename2 []="MyLog2. Log";
The static char logstr [MAXLINSIZE + 1];
Char datestr [16].
Char timestr [16].
Char MSS [4].
CRITICAL_SECTION cs_log;
The FILE * flog;
# ifdef _MSC_VER
The Lock (CRITICAL_SECTION void * l) {
The EnterCriticalSection (l);
}
Void Unlock (CRITICAL_SECTION * l) {
LeaveCriticalSection (l);
}
Void sleep_ms (int) ms {
Sleep (ms).
}
# the else
The Lock (CRITICAL_SECTION void * l) {
Pthread_mutex_lock (l);
}
Void Unlock (CRITICAL_SECTION * l) {
Pthread_mutex_unlock (l);
}
Void sleep_ms (int) ms {
Usleep (ms * 1000);
}
# endif
Void LogV (const char * pszFmt, va_list argp) {
* struct tm now;
Struct timeb TB;

If (NULL==pszFmt | | 0==pszFmt [0]) return;
Vsnprintf (logstr, MAXLINSIZE pszFmt, argp);
Ftime (& amp; TB);
Now=localtime (& amp; TB. Time);
Sprintf (datestr, "% d % % 4 d - 02-02 d", now - & gt; Tm_year + 1900, now - & gt; Tm_mon + 1, now - & gt; Tm_mday);
Sprintf (timestr, "02 02 02 % d: % d: % d", now - & gt; Tm_hour, now - & gt; Tm_min, now - & gt; Tm_sec);
Sprintf (MSS, "% 3 d", TB. Millitm);
Printf (" % s % s. % s % s ", datestr, timestr, MSS, logstr);
Flog=fopen (logfilename1, "a");
If (NULL! Flog)={
Fprintf (flog, "% s % s. % s % s", datestr, timestr, MSS, logstr);
If (ftell (flog) & gt; MAXLOGSIZE) {
The fclose (flog);
If (rename (logfilename1 logfilename2)) {
Remove (logfilename2);
Rename (logfilename1 logfilename2);
}
} else {
The fclose (flog);
}
}
}
Void the Log (const char * pszFmt,... ) {
Va_list argp;

The Lock (& amp; Cs_log);
Va_start (argp, pszFmt);
LogV (pszFmt argp);
Va_end (argp);
Unlock (& amp; Cs_log);
}
//the Log}
# define ASIZE 200
# define BSIZE 240
# define CSIZE 2
Char Abuf [ASIZE];
Char Cbuf [CSIZE];
CRITICAL_SECTION cs_HEX;
CRITICAL_SECTION cs_BBB;
Struct FIFO_BUFFER {
Int the head;
Int tail;
Int size;
Char data [BSIZE];
} BBB;
Int No_Loop=0;
Void HexDump) (int cn, char * buf, int len) {
Int I, j, k;
Char binstr [80].

The Lock (& amp; Cs_HEX);
for (i=0; IIf (0==16) (I %) {
Sprintf (binstr, "% 3 d % 4 x -", cn, I);
Sprintf (binstr, "% s % 02 x", binstr, buf (unsigned char) [I]);
} else if (15==16) (I %) {
Sprintf (binstr, "% s % 02 x", binstr, buf (unsigned char) [I]);
Sprintf (binstr, "% s", binstr);
For (j=I - 15; J<=I; J++) {
Sprintf (binstr, "% s % c," binstr, ('! '& lt; Buf [j] & amp; & Buf [j] <='~')? Buf [j] : '. ');
}
The Log (" % s \ n ", binstr);
} else {
Sprintf (binstr, "% s % 02 x", binstr, buf (unsigned char) [I]);
}
}
If (0! 16)=(I %) {
16 k=16 - (I %);
For (j=0; J
  • Related