Problem nastaje kad se prima vise podatak > ~1300byte u tom slucaju se upise prvi red u fajl, onda se zakuca na recv() do timeouta, a zatim izadje iz while petlje.
U pitanju je winCE 5.0 OS.
Saljem i dve funkcije
ispravljena RECEIVE_File()
SOCKET_Open()
evo ispravljene funkcije RECEIVE_File:
Code:
void CConnection::RECEIVE_File(CString naziv_fajla, BOOL sinhro, CString *error)
{
CString tt, str_tmp;
int x=0, socTimeout;
DWORD dw1, dw2;
char *rcvBuff = NULL;
rcvBuff = new char[128];
memset(rcvBuff, '\0', 128);
HANDLE hFile = CreateFile(naziv_fajla, GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
(*error) = _T("(RD2) GRESKA PRI KREIRANJU FAJLA.\n\rMOLIMO VAS POKUSAJTE PONOVO.");
CloseHandle(hFile);
return;
}
fd_set fdReadSet;
FD_ZERO(&fdReadSet);
FD_SET(s_socket, &fdReadSet);
fdReadSet.fd_array[0] = s_socket;
fdReadSet.fd_count = 1;
TIMEVAL tO;
//timeout 30 sec
socTimeout = 30;
tO.tv_sec = socTimeout;
tO.tv_usec = 0;
CString zz;
int err_code = -1, err_pokusaj = 0;
while(true)
{
FD_ZERO(&fdReadSet);
FD_SET(s_socket, &fdReadSet);
if ((err_code = select(0, &fdReadSet, NULL, NULL, &tO)) == SOCKET_ERROR)
{
SOCKET_Close();
SOCKET_Open();
(*error) = _T("SOCKET ERROR");
break;
}
if(err_code > 0)
{
if (FD_ISSET(s_socket, &fdReadSet))
{
memset(rcvBuff, '\0', 128);
x = recv(s_socket, rcvBuff, 128, 0);
zz.Format(_T("stiglo:%d byte"), x*sizeof(char));
AfxMessageBox(zz);
if(x == SOCKET_ERROR)
{
SOCKET_Close();
SOCKET_Open();
(*error) = _T("SOCKET ERROR");
break;
}
else
{
dw2 = x;
WriteFile( hFile, rcvBuff, dw2, &dw1, NULL);
zz.Format(_T("upisano u fajl:%d byte"), dw1*sizeof(char));
AfxMessageBox(zz);
if(x>6) //dogovor je da se na kraju salje odredjena kombinacija karaktera koja je duzine 7 .. i to se ovde proverava
{
if( RECEIVE_End(1, rcvBuff, x) )
{
SOCKET_Close();
SOCKET_Open();
AfxMessageBox(_T("DETEKTOVAN KRAJ."));
break;
}
memset(endBuff, '\0', 10);
endBuffLen = 0;
}
}
}else
AfxMessageBox(_T("FD_ISSET = FALSE"));
}else{
SOCKET_Close();
SOCKET_Open();
(*error) = _T("SOCKET TIMEOUT");
break; //timeout
zz.Format(_T("err_code: %d"),err_code);
AfxMessageBox(zz);
}
}
AfxMessageBox(_T("KRAJ"));
CloseHandle(hFile);
delete[] rcvBuff;
rcvBuff = NULL;
return;
}
ovo je funkcija SOCKET_Open():
Code:
BOOL CConnection::SOCKET_Open()
{
WSADATA wsaData;
int sndSockBufsize = 65536, rcvSockBufsize = 131072;
if(WSAStartup(MAKEWORD(2,2), &wsaData))
return FALSE;
s_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s_socket == INVALID_SOCKET || s_socket == SOCKET_ERROR)
return FALSE;
CString server_ip = data.ReadConfigValue(&csArrayConfig, _T("SERVER_IP"));
int server_port = _ttoi(data.ReadConfigValue(&csArrayConfig, _T("SERVER_PORT")));
SOCKADDR_IN SoketConf;
SoketConf.sin_family = PF_INET;
SoketConf.sin_port = htons(server_port);
SoketConf.sin_addr.s_addr = data.ConvertIpAddress(server_ip);
int is_connected = 0;
do{
is_connected = connect(s_socket, (struct sockaddr*)&SoketConf, sizeof(SoketConf));
}
while(select(0, 0, NULL, NULL, &timeoutSERVERA) == 0 || is_connected == 0 ); // timeoutSERVERA je 90 sec
if(s_socket == INVALID_SOCKET){
AfxMessageBox(_T("(OS) MOLIMO VAS POKUSAJTE PONOVO."),MB_OK|MB_ICONERROR);
return FALSE;
}
setsockopt(s_socket, IPPROTO_TCP, SO_SNDBUF, (char *)&sndSockBufsize, (int)sizeof(sndSockBufsize));
setsockopt(s_socket, IPPROTO_TCP, SO_RCVBUF, (char *)&rcvSockBufsize, (int)sizeof(rcvSockBufsize));
return TRUE;
}