I'm writting some test code on ndk_2_20_03_24. the CPU is C6748.
code on devices:
char sbuf[8*1024] = {0};
//char sbuf[32*1024] = {0};
Void task0(Arg id_arg)
{
int maxfd = 0;
fd_set readsocks;
SOCKET s,ds;
int nSendBuf, i;
int sendlen = 0;
struct sockaddr_in remote, local;
int remotelen = sizeof(struct sockaddr_in);
int locallen = sizeof(struct sockaddr_in);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 2000; //2000 u
memset(sbuf, 0, sizeof(sbuf));
fdOpenSession( (HANDLE)TaskSelf() );
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
local.sin_family = AF_INET;
local.sin_port = htons(3277);
local.sin_addr.s_addr = inet_addr("192.168.1.12");
remote.sin_family = AF_INET;
bind(s, (PSA)&local, locallen);
listen(s, 5);
ds = accept(s, (PSA)&remote, &remotelen);
nSendBuf = 32*1024;
setsockopt(ds, SOL_SOCKET, SO_SNDBUF, (void *)&nSendBuf, sizeof(int));
//nodelay = 1;
//setsockopt(ds, IPPROTO_TCP, TCP_NODELAY, (void *)&nodelay, sizeof(int));
i = 0;
if(ds != INVALID_SOCKET)
{
while(1)
{
FD_ZERO(&readsocks);
maxfd = (int)ds;
FD_SET(ds, &readsocks);
maxfd++;
if(fdSelect(maxfd, NULL, &readsocks, NULL, &timeout)>0)
{
if(FD_ISSET(ds, &readsocks))
{
i++;
*(int *)sbuf = i;
sendlen = send(ds, sbuf, sizeof(sbuf), 0);
if(sendlen <= 0)
{
break;
}
}
}
}
fdClose(ds);
}
fdClose(s);
fdCloseSession( (HANDLE)TaskSelf() );
TSK_exit();
}
code on pc:
#include "stdafx.h"
#include "windows.h"
#include "winsock2.h"
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
char rbuf[8192] = {0};
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET s;
unsigned short nVer = MAKEWORD(2,2);
WSAData wsa;
sockaddr_in remote;
DWORD prevtick, curtick;
if(WSAStartup(nVer, &wsa) == 0)
{
int reclen = 0, remainsize = 0,totallen = 0, statslen = 0;
int curM = 0;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
remote.sin_family = AF_INET;
remote.sin_port = htons(3277);
remote.sin_addr.s_addr = inet_addr("192.168.1.12");
FILE * fp = fopen("G:\\test.bin", "wb");
if(fp)
{
if(connect(s,(SOCKADDR *)&remote, sizeof(SOCKADDR))!=SOCKET_ERROR)
{
prevtick = GetTickCount();
while((reclen = recv(s, rbuf, sizeof(rbuf), 0))>0)
{
//fwrite(rbuf, 1, reclen, fp);
statslen += reclen;
totallen += reclen;
if(statslen >= 16*1024*1024)
{
curtick = GetTickCount();
printf("recv rate %f mb/s\n", ((float)statslen/(1024.0*1024.0))/(float)(curtick-prevtick)*1000.0);
statslen = 0;
prevtick = curtick;
}
if(totallen >= 256 *1024 *1024)
{
break;
}
}
Sleep(2000);
}
fclose(fp);
}
closesocket(s);
WSACleanup();
return 0;
}
}
if the sbuf is set to 32*1024 bytes size, the comunication has no problem.
but when I set the sbuf to 8*1024 bytes size, the comunication always stalled after transmit some data.
if anyone can help me?