/** * @file rdwt.c * * * @brief TCP/IPプロセス間通信のための低レベル関数 * * * * @brief Low level functions for TCP/IP inter-process communication * * * @author Akinobu LEE * @date Wed Feb 16 07:09:25 2005 * * $Revision: 1.6 $ * */ /* * Copyright (c) 1991-2012 Kawahara Lab., Kyoto University * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology * Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology * All rights reserved */ #include #include #define BUFSZ 4096 ///< Buffer size /** * @brief Read a data segment from a network stream. * * This function will block until the specified length has been received. * * @param fd [in] file descriptor * @param data [out] buffer to store the read data * @param len [out] received length in bytes * @param maxlen [in] maximum length of @a data buffer in bytes * * @return received data length in bytes, or -1 on error. */ int rd(int fd, char *data, int *len, int maxlen) { int count=0; int tmpbytes, tmplen; int toread = sizeof(int), ret, off = 0; while (toread > 0) { ret = #ifdef WINSOCK recv(fd,((char *)len) + off, toread, 0); #else read(fd,((char *)len) + off, toread); #endif if (ret <= 0) { if (ret < 0) jlog("Error: rdwt: failed to read data at %d / %d\n", count, len); return(-1); } toread -= ret; off += ret; } #ifdef WORDS_BIGENDIAN swap_bytes((char *)len, sizeof(int), 1); #endif if (*len > maxlen) { jlog("Error: rdwt: transfer data length exceeded: %d (>%d)\n", len, maxlen); return(-1); } while (count<(*len)){ tmplen = (*len) - count; if (tmplen > BUFSZ) tmplen = BUFSZ; if ((tmpbytes = #ifdef WINSOCK recv(fd,data+count,tmplen,0) #else read(fd,data+count,tmplen) #endif ) < 0) { jlog("Error: rdwt: failed to read data at %d / %d\n",count, len); return(count); } count += tmpbytes; } return(count); } /** * @brief Write a data segment to a network stream. * * @param fd [in] file descriptor * @param data [in] buffer that holds data to write * @param len [out] received length in bytes * * @return actually written data length in bytes, or -1 on error. */ int wt(int fd, char *data, int len) { int tmpbytes; #ifdef WORDS_BIGENDIAN swap_bytes((char *)&len, sizeof(int), 1); #endif /* len == 0 is used to tell end of segment ack */ if ((tmpbytes= #ifdef WINSOCK send(fd,(char *)&len,sizeof(int),0) #else write(fd,(char *)&len,sizeof(int)) #endif ) != sizeof(int)) { /*jlog( "failed to write num\n");*/ return(-1); } #ifdef WORDS_BIGENDIAN swap_bytes((char *)&len, sizeof(int), 1); #endif if (len > 0) { if ((tmpbytes= #ifdef WINSOCK send(fd,data,len,0) #else write(fd,data,len) #endif ) < 0) { jlog("Error: rdwt: failed to write data (%d bytes)\n",len); return(-1); } } else { tmpbytes = 0; } return(tmpbytes); }