The Application has limitations not to use other protocols.
I am not writing a new protocol, just want to use TCP/IP to transfer large size data.
Language used is "C"
void *NetCtrlThread(void *param)
{
int l_soc = -1;
netthrd_running = 1;
netthd_stop = 0;
fprintf(stderr, "NetCtrlThread():start\r\n");
// ネットワーク制御
while (!netthd_stop/*1*/) {
// listenソケット生成
if ((l_soc = NetListen(NET_PORT_NO)) < 0) {
// 暫定 エラー処理
fprintf(stderr, "NetCtrlThread():listen error\r\n");
sleep(1);
continue;
}
fprintf(stderr, "NetCtrlThread():listen ok\r\n");
// accept
if ((NetSocket = NetAccept(l_soc)) < 0) {
// 暫定 エラー処理
fprintf(stderr, "NetCtrlThread():accept error\r\n");
close(l_soc);
sleep(1);
continue;
}
fprintf(stderr, "NetCtrlThread():accept ok\r\n");
// listenソケットクローズ
close(l_soc);
// select
struct timeval timeout;
fd_set mask;
int width;
int len, err;
err = 0;
while (!netthd_stop/*1*/) {
// 受信
// fprintf(stderr, "NetCtrlThread():select():start\r\n");
struct timespec tim_req, tim_rem;
tim_req.tv_sec = 0;
tim_req.tv_nsec = 2 * 1000 * 1000; // 1mSec周期
FD_ZERO(&mask);
FD_SET(NetSocket, &mask);
width = NetSocket + 1;
timeout.tv_sec = NET_TIME_OUT_SEC; // select タイムアウト時間
timeout.tv_usec = NET_TIME_OUT_USEC;
switch (select(width, &mask, NULL, NULL, &timeout)) {
case -1: // エラー
fprintf(stderr, "NetCtrlThread():select():error\r\n");
err = -1;
break;
case 0: // timeout
// fprintf(stderr, "NetCtrlThread():select():timeout\r\n");
break;
default:
if (FD_ISSET(NetSocket, &mask)) {
fprintf(stderr, "NetCtrlThread():FD_ISEET():OK\r\n");
nanosleep(&tim_req, &tim_rem);
if ((len = recv(NetSocket, NetSocRcvBuff, sizeof(NetSocRcvBuff), 0)) < 0) {
fprintf(stderr, "NetCtrlThread():recv():error\r\n");
// 受信エラー
err = -1;
// break ;
}else if(len == 0){ // Editted on 26-1-2009 to print the closing of connection
fprintf(stderr, "NetCtrlThread():recv():errormsg = Connection has been closed:\r\n");
err = -1;
// break ;
} // Edit end
else {
char buff[256];
memset(buff, 0 ,sizeof(buff));
memcpy(buff, NetSocRcvBuff, /*len*/4);
fprintf(stderr, "NetCtrlThread():recv()

k:msg=%d : %s\r\n",len, buff);
// 今回受信データをアプリケーション用受信バッファにコピー
if (NetRcvSize + len > NET_RCV_BUFF_SIZE) { // バッファのガード
NetRcvSize = 0;
}
// Sending back acknowlegement of data
unsigned short type, chksum = 0 ;
unsigned long size = 0 ;
int retval ;
type = (NetSocRcvBuff[1]<<8)+NetSocRcvBuff[2] ;
size = (NetSocRcvBuff[4]<<24)+(NetSocRcvBuff[5]<<16)+(NetSocRcvBuff[6]<<8)+NetSocRcvBuff[7] ;
chksum = (NetSocRcvBuff[8]<<8)+NetSocRcvBuff[9] ;
fprintf(stderr, "NetCtrlThread() : recv (): size = :%d\r\n", size) ;
int temp = len - 10 ;
fprintf(stderr, "NetCtrlThread() : recv (): len - size = :%d\r\n", temp) ;
if(size != (len-10)){
fprintf(stderr, "NetCtrlThread():recv(): Data Received is not complete :\r\n");
//nanosleep(&tim_req, &tim_rem);
// enter in while loop to call the recv function again.
memcpy(&NetRcvBuff[0], &NetSocRcvBuff[0], 4); // コピー
}else{
memcpy(&NetRcvBuff[0], &NetSocRcvBuff[0], len); // コピー
if((retval = CheckData(type, size, chksum, /*&NetSocRcvBuff[10]*/&NetRcvBuff[10]))!=0){
fprintf(stderr, "CheckData():Error: msg= :%d\r\n", retval);
NetRcvBuff[3] = 0x4E ;
fprintf(stderr, "NetCtrlThread():recv()

k:msg= : %s Data received is not correct \r\n");
}
else{
NetRcvBuff[3] = 0x41 ;
fprintf(stderr, "NetCtrlThread():recv()

k:msg= : Correct data received, size=:%d checksum=:%d\r\n", size,chksum);
}
}
// memcpy(&NetRcvBuff[NetRcvSize], NetSocRcvBuff, 4); // コピー
NetRcvSize += 4;
// 受信データを検査してコマンド受信確定かどうかチェック
// コマンド受信確定であればコマンドに対応した処理を実行
#if 1 // for debug
NetSndReq(NetRcvBuff, NetRcvSize);
NetRcvSize = 0;
#endif
} // end of else
}
break;
}
if (err < 0) {
fprintf(stderr, "NetCtrlThread():error = :%d\r\n",err);
break;
}
// 送信
if (NetSndSize) {
pthread_mutex_lock(&NetBuffMutex);
if ((len = send(NetSocket, NetSocSndBuff, NetSndSize, 0)) < 0) {
fprintf(stderr, "NetCtrlThread():send():error\r\n");
// 送信エラー
err = -2;
}
else {
fprintf(stderr, "NetCtrlThread():send()

k\r\n");
}
NetSndSize = 0;
pthread_mutex_unlock(&NetBuffMutex);
}
if (err < 0) {
fprintf(stderr, "NetCtrlThread():error = :%d\r\n",err);
break;
}
}
close(NetSocket); // ソケットクローズ
NetSocket = 0;
sleep(1);
}
netthrd_running = 0;
return NULL;
}