コード例 #1
0
ファイル: sysdeps_qemu.c プロジェクト: hongjiujing/Opensource
int
sys_channel_read( SysChannel  channel, void*  buffer, int  size )
{
    int   len = size;
    char* buf = (char*) buffer;

    while (len > 0) {
        int  ret = socket_recv(channel->fd, buf, len);
        if (ret < 0) {
            if (errno == EINTR)
                continue;
            if (errno == EWOULDBLOCK || errno == EAGAIN)
                break;
            D( "%s: after reading %d bytes, recv() returned error %d: %s\n",
                __FUNCTION__, size - len, errno, errno_str);
            return -1;
        } else if (ret == 0) {
            break;
        } else {
            buf += ret;
            len -= ret;
        }
    }
    return size - len;
}
コード例 #2
0
ファイル: test_server.c プロジェクト: billypu/lua-lab
int test_tcp() {
    int fd = socket_new(SOCK_STREAM);  
    fd =socket_bind(fd, "", 9000);
    fd = socket_listen(fd);
    
    printf("socket fd: %d\n", fd);

    char cip[16] = {0};
    int connfd = socket_accept(fd, cip);
    if (connfd < 0) {
        printf("accept failed\n");
        return -1;
    }

    printf("start to recv\n");
    char* msg = (char*)socket_recv(connfd);

    printf("body=%s\n", msg);

    socket_send(connfd, "back from server", strlen("back from server"));

    free(msg);
    close(connfd);
    close(fd);

    return 0;
}
コード例 #3
0
AsyncStatus
asyncReader_read(AsyncReader*  ar)
{
    int  ret;

    if (ar->pos >= ar->buffsize) {
        return ASYNC_COMPLETE;
    }

    do {
        ret = socket_recv(ar->io->fd, ar->buffer + ar->pos, ar->buffsize - ar->pos);
        if (ret == 0) {
            /* disconnection ! */
            errno = ECONNRESET;
            return ASYNC_ERROR;
        }
        if (ret < 0) {
            if (errno == EINTR) /* loop on EINTR */
                continue;
            if (errno == EWOULDBLOCK || errno == EAGAIN) {
                loopIo_wantRead(ar->io);
                return ASYNC_NEED_MORE;
            }
            return ASYNC_ERROR;
        }
        ar->pos += ret;

    } while (ar->pos < ar->buffsize);

    loopIo_dontWantRead(ar->io);
    return ASYNC_COMPLETE;
}
コード例 #4
0
ファイル: ser.c プロジェクト: antontest/c
int main(int argc, char *argv[])
{
    //int clifd = -1;
    int len = 0;
    char buf[128] = {0};
    struct socket_impl sck;

    if (inet_server_create(&sck, SOCK_STREAM, NULL, 5001) == -1)
        return -1;

    //clifd = socket_accept(sck.fd);
    //printf("accept succ\n");
    //printf("fd = %d\n", clifd);
    sleep(1);
    socket_event_add(&sck.evl, SOCKET_ON_CLOSE, on_close, NULL);
    socket_event_add(&sck.evl, SOCKET_ON_RECV, on_recv, NULL);
    while (sck.cli_fd[0] == -1) usleep(200);
    while ((len = socket_recv(sck.cli_fd[0], buf, sizeof(buf))))
    {
		if (len <= 0) break;
        printf("len: %d, info: %s\n", len, buf);

        socket_send(sck.cli_fd[0], "hi,cli!", sizeof("hi,cli!"));
        //sleep(1);
    }

    printf("over\n");
    return 0;
}
コード例 #5
0
ファイル: http_download.c プロジェクト: hangyan/Code
int http_get_file_size(int sockfd,char* path)
{
    int ret = -1;
    char buf_recv_temp[BUFFER_SIZE+1];
    head_to_get_file_size(path);

    #ifdef HTTP_DEBUG
    printf("\nsend : \n%s \n",buf_send);
    #endif

    socket_send(sockfd,buf_send,strlen(buf_send),0);
    memset(buf_recv_temp,0,sizeof(buf_recv_temp));
    ret = socket_recv(sockfd, buf_recv_temp, sizeof(buf_recv_temp)-1, 0);

    
    D(printf("recv len = %d\n",ret));
    D(printf("recv = %s\n",buf_recv_temp));
    

    if( ret <= 0 )
    {
        perror("ERROR: failed to get file size");
        return -1;
    }

    ret = http_get_content_length(buf_recv_temp);
    if( ret <= 0 )
        return -1;
    else
        return ret;
    
}
コード例 #6
0
ファイル: udp.c プロジェクト: AntonioModer/luasocket
/*-------------------------------------------------------------------------*\
* Receives data from a UDP socket
\*-------------------------------------------------------------------------*/
static int meth_receive(lua_State *L) {
    p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1);
    char buf[UDP_DATAGRAMSIZE];
    size_t got, wanted = (size_t) luaL_optnumber(L, 2, sizeof(buf));
    char *dgram = wanted > sizeof(buf)? (char *) malloc(wanted): buf;
    int err;
    p_timeout tm = &udp->tm;
    timeout_markstart(tm);
    if (!dgram) {
        lua_pushnil(L);
        lua_pushliteral(L, "out of memory");
        return 2;
    }
    err = socket_recv(&udp->sock, dgram, wanted, &got, tm);
    /* Unlike TCP, recv() of zero is not closed, but a zero-length packet. */
    if (err != IO_DONE && err != IO_CLOSED) {
        lua_pushnil(L);
        lua_pushstring(L, udp_strerror(err));
        if (wanted > sizeof(buf)) free(dgram);
        return 2;
    }
    lua_pushlstring(L, dgram, got);
    if (wanted > sizeof(buf)) free(dgram);
    return 1;
}
コード例 #7
0
ファイル: socket.c プロジェクト: antontest/c
void on_recv(int fd, void *arg)
{
    char buf[128] = {0};
    int sock_type = get_socket_type(fd);
    int proto_type = get_socket_protocol(fd);

    switch (sock_type) {
        case SOCK_STREAM:
            if (proto_type == IPPROTO_TCP)
                socket_recv(fd, buf, sizeof(buf));
            else if (proto_type == IPPROTO_SCTP) ;
            else return; 
            break;
        case SOCK_DGRAM:
            socket_addr_recvfrom(fd, buf, sizeof(buf), 
                    (void *)&((struct socket_impl *)arg)->addr.in_addr);
            break;
        default:
            return;
            break;
    }

    printf("recv from %s: %s\n", 
            inet_ntoa(((struct socket_impl *)arg)->addr.in_addr.sin_addr), 
            buf);
}
コード例 #8
0
ファイル: helper.cpp プロジェクト: hundeboll/raw_rlnc
    void recv_packet(int sock)
    {
        ssize_t res;

        while ((res = socket_recv(sock, &m_frame[0], m_frame.size())) >= 0) {
            if (res == 0)
                continue;

            if (payload_hdr_is_done(m_payload_hdr)) {
                stop();
                return;
            }

            if (!payload_hdr_block_id_equal(m_payload_hdr))
                continue;

            if (payload_hdr_is_ack(m_payload_hdr) &&
                packet_hdr_is_from_dest(m_packet_hdr)) {
                m_packets = 0;
                m_budget = 0;
                payload_data_reset();
                continue;
            }

            if (payload_hdr_is_enc(m_payload_hdr))
                payload_data_read(m_payload_data);

            if (payload_data_received() >= m_threshold)
                send_budget();

            if (payload_data_is_complete())
                send_ack();
        }
    }
コード例 #9
0
ファイル: socket.c プロジェクト: sische/MasterThesis
ssize_t recv(int sock, void * p_buf, size_t buf_size, int flags)
{
    VERIFY_MODULE_IS_INITIALIZED();
    VERIFY_SOCKET_ID(sock);
    NULL_PARAM_CHECK(p_buf);

    SOCKET_MUTEX_LOCK();
    socket_entry_t * p_socket_entry = &m_socket_table[sock];
    SOCKET_MUTEX_UNLOCK();

    ssize_t ret = -1;
    if (p_socket_entry->state == STATE_CONNECTED)
    {
        uint32_t recv_size = 0;
        uint32_t err_code = socket_recv(&p_socket_entry->handle,
                                        p_buf,
                                        buf_size,
                                        &recv_size,
                                        flags);
        if (err_code == NRF_SUCCESS)
        {
            ret = (ssize_t) recv_size;
        }
        socket_set_errno(err_code);
    }
    else
    {
        set_errno(ENOTCONN);
    }
    return ret;
}
コード例 #10
0
ファイル: pbpal_sockets.c プロジェクト: evanbeard/c-core
bool pbpal_read_over(pubnub_t *pb)
{
    unsigned to_read = 0;
    WATCH_ENUM(pb->sock_state);
    WATCH_USHORT(pb->readlen);
    WATCH_USHORT(pb->left);
    WATCH_UINT(pb->len);

    if (pb->readlen == 0) {
        int recvres;
        to_read =  pb->len - pbpal_read_len(pb);
        if (to_read > pb->left) {
            to_read = pb->left;
        }
        recvres = socket_recv(pb->pal.socket, (char*)pb->ptr, to_read, 0);
        if (recvres <= 0) {
            /* This is error or connection close, which may be handled
               in some way...
             */
            return false;
        }
        pb->sock_state = STATE_READ;
        pb->readlen = recvres;
    } 


    to_read = pb->len;
    if (pb->readlen < to_read) {
        to_read = pb->readlen;
    }
    pb->ptr += to_read;
    pb->readlen -= to_read;
    PUBNUB_ASSERT_OPT(pb->left >= to_read);
    pb->left -= to_read;
    pb->len -= to_read;

    if (pb->len == 0) {
        pb->sock_state = STATE_NONE;
        return true;
    }

    if (pb->left == 0) {
        /* Buffer has been filled, but the requested block has not been
         * read.  We have to "reset" this "mini-fsm", as otherwise we
         * won't read anything any more. This means that we have lost
         * the current contents of the buffer, which is bad. In some
         * general code, that should be reported, as the caller could
         * save the contents of the buffer somewhere else or simply
         * decide to ignore this block (when it does end eventually).
         */
        pb->sock_state = STATE_NONE;
    }
    else {
        pb->sock_state = STATE_NEWDATA_EXHAUSTED;
        return false;
    }

    return true;
}
コード例 #11
0
/*
 * Asynchronous I/O callback launched when framebuffer notifications are ready
 * to be read.
 * Param:
 *  opaque - FrameBufferImpl instance.
 */
static void
_fbUpdatesImpl_io_callback(void* opaque, int fd, unsigned events)
{
    FrameBufferImpl* fbi = opaque;
    int  ret;

    // Read updates while they are immediately available.
    for (;;) {
        // Read next chunk of data.
        ret = HANDLE_EINTR(
                socket_recv(fbi->sock,
                            fbi->reader_buffer + fbi->reader_offset,
                            fbi->reader_bytes - fbi->reader_offset));
        if (ret < 0 && (errno == EWOULDBLOCK || errno == EAGAIN)) {
            // Chunk is not avalable at this point. Come back later.
            return;
        }
        if (ret <= 0) {
            /* disconnection ! */
            derror("Unable to receive framebuffer data: %s\n",
                   ret < 0 ? strerror(errno), "unexpected disconnection");
            fbUpdatesImpl_destroy();
            return;
        }

        fbi->reader_offset += ret;
        if (fbi->reader_offset != fbi->reader_bytes) {
            // There are still some data left in the pipe.
            continue;
        }

        // All expected data has been read. Time to change the state.
        if (fbi->fb_state == EXPECTS_HEADER) {
            // Update header has been read. Prepare for the pixels.
            fbi->fb_state = EXPECTS_PIXELS;
            fbi->reader_offset = 0;
            fbi->reader_bytes = fbi->update_header.w *
                                      fbi->update_header.h *
                                      (fbi->bits_per_pixel / 8);
            fbi->reader_buffer = malloc(fbi->reader_bytes);
            if (fbi->reader_buffer == NULL) {
                APANIC("Unable to allocate memory for framebuffer update\n");
            }
        } else {
            // Pixels have been read. Prepare for the header.
             uint8_t* pixels = fbi->reader_buffer;

            fbi->fb_state = EXPECTS_HEADER;
            fbi->reader_offset = 0;
            fbi->reader_bytes = sizeof(FBUpdateMessage);
            fbi->reader_buffer = (uint8_t*)&fbi->update_header;

            // Perform the update. Note that pixels buffer must be freed there.
            _update_rect(fbi->fb, fbi->update_header.x,
                        fbi->update_header.y, fbi->update_header.w,
                        fbi->update_header.h, fbi->bits_per_pixel,
                        pixels);
        }
    }
コード例 #12
0
static unsigned char client_read_byte(const remote_process_client *client)
{
    unsigned char data;
    if (0 != socket_recv(client->socket, (char*)&data, 1)) {
        exit(10012);
    }
    return data;
}
コード例 #13
0
ファイル: MStation.c プロジェクト: liuning587/MStation
/**
 ******************************************************************************
 * @brief      1. 打开读卡器
 * @param[in]  None
 * @param[out] None
 *
 * @retval     0 : 打开读卡器端口成功
 * @retval     1 : 打开读卡器端口失败
 ******************************************************************************
 */
extern int
MS_OpenPort()
{
    unsigned int socketfd = 0;
    char buf[16] = {0};
    int pos = 0;
    int sendlen = 0;
    int recvlen = 0;
    int ret = 1;

    if ((socketfd = connect_start()) == 0)
    {
        log_exit();
        return 1;
    }
    memcpy(buf, the_head, 3);   //3字节GET
    pos += 3;
    buf[pos] = 1;
    pos += 1;
    memcpy(buf + pos, &sendlen, sizeof(int));
    pos += sizeof(int);

    do
    {
        if ((sendlen + 8) != socket_send(socketfd, buf, sendlen + 8))
        {
            log_print("%s发送数据数据出错\n", __FUNCTION__);
            break;
        }
        memset(buf, 0x00, sizeof(buf));
        recvlen = socket_recv(socketfd, buf, 12); //len = 8 + 4
        if ((recvlen == -1) || (recvlen != 12))
        {
            log_print("%s接收数据出错[recvlen:%d]\n", __FUNCTION__, recvlen);
            break;
        }
        pos = 0;
        if ((memcmp(buf, "PUT", 3) != 0) || (buf[3] != 1))
        {
            log_print("%s 头不合法\n", __FUNCTION__);
            break;
        }
        pos += 4;
        memcpy(&recvlen, buf + pos, sizeof(int));
        if (recvlen != sizeof(int))
        {
            log_print("%s 长度不合法\n", __FUNCTION__);
            break;
        }
        pos += 4;
        memcpy(&ret, buf + pos, sizeof(int));
        ret = (ret == 0) ? ret : 1;
    } while(0);
    connect_close(socketfd);

    return ret;
}
コード例 #14
0
ファイル: client.c プロジェクト: AtomSoftTech/retrobsd
int client_getc (client_t *c)
{
    uint8_t b;

    if (socket_recv (c->sock, &b, 1) <= 0) {
        // No data available
        return -1;
    }
    return b;
}
コード例 #15
0
ファイル: NetApi.cpp プロジェクト: bgtwoigu/Innov_code
int ReadMessage( unsigned int* sock, int count , char* buffer , int*len , int*errorid , int timeout )
{
	int error = 0;
	fd_set set;
	FD_ZERO(&set);
	for( int i=0; i<count; i++ )
		if( sock[i] != 0 )
			FD_SET( sock[i] , &set);
	struct timeval tv;
	tv.tv_sec = 0;
	tv.tv_usec = timeout*1000;
	int num = select( FD_SETSIZE , &set, NULL, NULL, &tv);
	if (num > 0)
	{
		for( int i=0; i<count; i++ )
		{
			if( sock[i] && FD_ISSET( sock[i] , &set ) )
			{
				int length;
				TraceMsg( "to receive %d\n" , i  );
				if( socket_recv( sock[i], (char*)&length, sizeof(length)) == 0)
				{
					if ( socket_recv( sock[i], buffer , length) == 0)
					{
						*len = length;
						return i;
					}
					else
						error = -1;
				}
				else
					error = -2;
				if( error )
					*errorid = i;
				break;
			}
		}
	}
	else if( num < 0 )
		error = -3;
	return error;
}
コード例 #16
0
ファイル: pbpal_sockets.c プロジェクト: evanbeard/c-core
enum pubnub_res pbpal_line_read_status(pubnub_t *pb)
{
    uint8_t c;

    if (pb->readlen == 0) {
        int recvres = socket_recv(pb->pal.socket, (char*)pb->ptr, pb->left, 0);
        if (recvres < 0) {
            if (socket_timed_out()) {
                return PNR_TIMEOUT;
            }
            if (PUBNUB_BLOCKING_IO_SETTABLE && pb->options.use_blocking_io) {
                return PNR_IO_ERROR;
            }
            return socket_would_block() ? PNR_IN_PROGRESS : PNR_IO_ERROR;
        }
        else if (0 == recvres) {
            return PNR_TIMEOUT;
        }
        PUBNUB_LOG_TRACE("have new data of length=%d: %s\n", recvres, pb->ptr);
        pb->sock_state = STATE_READ_LINE;
        pb->readlen = recvres;
    }

    while (pb->left > 0 && pb->readlen > 0) {
        c = *pb->ptr++;

        --pb->readlen;
        --pb->left;
        
        if (c == '\n') {
            int read_len = pbpal_read_len(pb);
            PUBNUB_LOG_TRACE("\n found: "); WATCH_INT(read_len); WATCH_USHORT(pb->readlen);
            pb->sock_state = STATE_NONE;
            return PNR_OK;
        }
    }

    if (pb->left == 0) {
        /* Buffer has been filled, but new-line char has not been
         * found.  We have to "reset" this "mini-fsm", as otherwise we
         * won't read anything any more. This means that we have lost
         * the current contents of the buffer, which is bad. In some
         * general code, that should be reported, as the caller could
         * save the contents of the buffer somewhere else or simply
         * decide to ignore this line (when it does end eventually).
         */
        pb->sock_state = STATE_NONE;
    }
    else {
        pb->sock_state = STATE_NEWDATA_EXHAUSTED;
    }

    return PNR_IN_PROGRESS;
}
コード例 #17
0
ファイル: fcgi_buf.c プロジェクト: AzerTyQsdF/osx
/*******************************************************************************
 * Read from an open file descriptor into buffer.
 *
 * The caller should disable the default Apache SIGPIPE handler,
 * otherwise a bad script could cause the request to abort and appear
 * as though the client's fd caused it.
 *
 * Results:
 *      <0 error, errno is set
 *      =0 EOF reached
 *      >0 successful read or no room in buffer (NOT # of bytes read)
 */
int fcgi_buf_socket_recv(Buffer *buf, SOCKET fd)
{
    int len;

    fcgi_buf_check(buf);

    if (buf->length == buf->size)
        /* there's no room in the buffer, return "success" */
        return 1;

    if (buf->length == 0)
        /* the buffer is empty so defrag */
        buf->begin = buf->end = buf->data;

    len = min(buf->size - buf->length, buf->data + buf->size - buf->end);

#ifndef NO_WRITEV

    /* assume there is a readv() since there is a writev() */
    if (len == buf->size - buf->length) 
    {
#endif

        len = socket_recv(fd, buf->end, len);

#ifndef NO_WRITEV
    } 
    else 
    {
        /* the buffer is wrapped, use readv() */
        struct iovec vec[2];

        vec[0].iov_base = buf->end;
        vec[0].iov_len = len;
        vec[1].iov_base = buf->data;
        vec[1].iov_len = buf->size - buf->length - len;

        ASSERT(len);
        ASSERT(vec[1].iov_len);

        do
        {
            len = readv(fd, vec, 2);
        }
        while (len == -1 && errno == EINTR);
    }
#endif

    if (len <= 0) return len;

    fcgi_buf_added(buf, len);

    return len;     /* this may not contain the number of bytes read */
}
コード例 #18
0
bool DrainerObject::drainSocket() {
    errno = 0;
    char buff[1024];
    int size = socket_recv(mSocket, buff, sizeof(buff));
    if (size > 0) {
        return true;
    } else if (size < 0 && errno == EWOULDBLOCK) {
        return true;
    }
    mSocketIsDrained = true;
    return false;
}
コード例 #19
0
ファイル: udp.c プロジェクト: denrusio/vak-opensource
/*
 * Read a received packet into buffer buf (which is of maximum length len);
 * store calling ip and port as well. Call available() to make sure data is
 * ready first.
 * NOTE: I don't believe len is ever checked in implementation of recvfrom(),
 *       so it's easy to overflow buffer. so we check and truncate.
 * Returns number of bytes read, or negative number of bytes we would have
 * needed if we truncated.
 */
int udp_read_packet (udp_t *u, uint8_t *buf, unsigned len,
                     uint8_t *ip, unsigned *port)
{
    int nbytes = udp_available (u) - 8;     /* skip UDP header */
    if (nbytes < 0) {
        /* No real data here. */
        return 0;
    }

    if (nbytes > (int)len) {
        /* Packet is too large - truncate.
         * HACK: hand-parse the UDP packet using TCP recv method. */
        uint8_t tmpBuf[8];
        int i;

        /* Read 8 header bytes and get IP and port from it. */
        socket_recv (u->sock, tmpBuf, 8);
        if (ip != 0) {
            ip[0] = tmpBuf[0];
            ip[1] = tmpBuf[1];
            ip[2] = tmpBuf[2];
            ip[3] = tmpBuf[3];
        }
        if (port != 0)
            *port = (tmpBuf[4] << 8) + tmpBuf[5];

        /* Now copy first (len) bytes into buf. */
        for (i=0; i<(int)len; i++) {
            socket_recv (u->sock, tmpBuf, 1);
            buf[i] = tmpBuf[0];
        }

        /* And just read the rest byte by byte and throw it away. */
        while (udp_available (u)) {
            socket_recv (u->sock, tmpBuf, 1);
        }
        return -nbytes;
    }
    return socket_recvfrom (u->sock, buf, len, ip, port);
}
コード例 #20
0
static int
netPipe_recvBuffers( void* opaque, GoldfishPipeBuffer*  buffers, int  numBuffers )
{
    NetPipe*  pipe = opaque;
    int       count = 0;
    int       ret   = 0;
    int       buffStart = 0;
    GoldfishPipeBuffer* buff = buffers;
    GoldfishPipeBuffer* buffEnd = buff + numBuffers;

    for (; buff < buffEnd; buff++)
        count += buff->size;

    buff = buffers;
    while (count > 0) {
        int  avail = buff->size - buffStart;
        int  len = socket_recv(pipe->io->fd, buff->data + buffStart, avail);

        /* the read succeeded */
        if (len > 0) {
            buffStart += len;
            if (buffStart >= buff->size) {
                buff++;
                buffStart = 0;
            }
            count -= len;
            ret   += len;
            continue;
        }

        /* we reached the end of stream? */
        if (len == 0) {
            if (ret == 0)
                ret = PIPE_ERROR_IO;
            break;
        }

        /* if we already read some stuff, simply return */
        if (ret > 0) {
            break;
        }

        /* need to return an appropriate error code */
        if (errno == EAGAIN || errno == EWOULDBLOCK) {
            ret = PIPE_ERROR_AGAIN;
        } else {
            ret = PIPE_ERROR_IO;
        }
        break;
    }
    return ret;
}
コード例 #21
0
//TODO: Make so this warning goes away.
void * output_thread (void) {
	printf("CIEL: Output thread started....\n");
	//sion_entry testentry; //DEBUG
	uint8_t ostring[SCANDALSTRINGSIZE];
	printf("CIEL: Done initialising output thread, entering main loop...\n");
	while(1) {
		if (socket_readable(&sockfd_telemout) == 0) {//if there is data...
			socket_recv(&sockfd_telemout, ostring, SCANDALSTRINGSIZE); //grab it
			socket_send(&sockfd_sion, ostring, SCANDALSTRINGSIZE, sioninfo); //and pass it to SION
		}
	}
	pthread_exit(NULL);
}
コード例 #22
0
ファイル: sacd_pb_stream.c プロジェクト: chienbv/sacd-ripper
static bool read_callback(pb_istream_t *stream, uint8_t *buf, size_t count)
{
    int result;
    size_t got = 0;
    p_socket socket = (p_socket) stream->state;

    if (buf == NULL)
    {
        /* Well, this is a really inefficient way to skip input. */
        /* It is only used when there are unknown fields. */
        char dummy;
        while (count-- && socket_recv(socket, &dummy, 1, &got, MSG_WAITALL, 0) == IO_DONE && got == 1);
        return count == 0;
    }
    
    result = socket_recv(socket, (char *) buf, count, &got, MSG_WAITALL, 0);

    if (result != IO_DONE)
        stream->bytes_left = 0; /* EOF */
    
    return got == count && result == IO_DONE;
}
コード例 #23
0
ファイル: socket.c プロジェクト: ShiftMediaProject/gnutls
ssize_t
socket_recv_timeout(const socket_st * socket, void *buffer, int buffer_size, unsigned ms)
{
	int ret;

	if (socket->secure)
		gnutls_record_set_timeout(socket->session, ms);
	ret = socket_recv(socket, buffer, buffer_size);

	if (socket->secure)
		gnutls_record_set_timeout(socket->session, 0);

	return ret;
}
コード例 #24
0
ファイル: pbpal_sockets.c プロジェクト: mkhare/tunnelpi
bool pbpal_read_over(pubnub_t *pb)
{
    unsigned to_read = 0;
    WATCH_ENUM(pb->sock_state);
    WATCH_USHORT(pb->readlen);
    WATCH_USHORT(pb->left);
    WATCH_UINT(pb->len);

    if (pb->readlen == 0) {
        int recvres;
        to_read =  pb->len - pbpal_read_len(pb);
        if (to_read > pb->left) {
            to_read = pb->left;
        }
        recvres = socket_recv(pb->pal.socket, (char*)pb->ptr, to_read, 0);
        if (recvres <= 0) {
            /* This is error or connection close, which may be handled
               in some way...
             */
            return false;
        }
        pb->sock_state = STATE_READ;
        pb->readlen = recvres;
    } 

    pb->ptr += pb->readlen;
    pb->left -= pb->readlen;
    pb->readlen = 0;

    if (pbpal_read_len(pb) >= (int)pb->len) {
        /* If we have read all that was requested, we're done. */
        PUBNUB_LOG_TRACE("Read all that was to be read.\n");
        pb->sock_state = STATE_NONE;
        return true;
    }

    if ((pb->left > 0)) {
        pb->sock_state = STATE_NEWDATA_EXHAUSTED;
        return false;
    }

    /* Otherwise, we just filled the buffer, but we return 'true', to
     * enable the user to copy the data from the buffer to some other
     * storage.
     */
    PUBNUB_LOG_WARNING("Filled the buffer, but read %d and should %d\n", pbpal_read_len(pb), pb->len);
    pb->sock_state = STATE_NONE;
    return true;
}
コード例 #25
0
DrainerObject::~DrainerObject() {
    if (!mSocketIsDrained) {
        char buff[1024];
        while(socket_recv(mSocket, buff, sizeof(buff)) > 0) { ; }
        mSocketIsDrained = true;
    }
    shutdownRead();
    if (mLooper) {
        loopIo_dontWantRead(mIo);
        loopIo_done(mIo);
        mLooper = 0;
    }
    closeSocket();
    mSocket = -1;
    mParent = 0;
}
コード例 #26
0
bool ThreadedSocketConnection::read()
{
  struct timeval timeout = { 1, 0 };
  fd_set readset = m_fds;

  try
  {
    // Wait for input (1 second timeout)
    int result = select( 1 + m_socket, &readset, 0, 0, &timeout );

    if( result > 0 ) // Something to read
    {
      // We can read without blocking
      ssize_t size = socket_recv( m_socket, m_buffer, sizeof(m_buffer) );
      if ( size <= 0 ) { throw SocketRecvFailed( size ); }
      m_parser.addToStream( m_buffer, size );
    }
    else if( result == 0 && m_pSession ) // Timeout
    {
      m_pSession->next();
    }
    else if( result < 0 ) // Error
    {
      throw SocketRecvFailed( result );
    }

    processStream();
    return true;
  }
  catch ( SocketRecvFailed& e )
  {
    if( m_disconnect )
      return false;

    if( m_pSession )
    {
      m_pSession->getLog()->onEvent( e.what() );
      m_pSession->disconnect();
    }
    else
    {
      disconnect();
    }

    return false;
  }
}
コード例 #27
0
ファイル: http_download.c プロジェクト: hangyan/Code
int http_recv(int sockfd,char* buf_recv)
{
    int ret;
    int recv_len = 0;
    int download_len = 0;
    char buf_recv_temp[BUFFER_SIZE];
    int j = 0;
    
    memset(buf_recv_temp,0,sizeof(buf_recv_temp));
    while(1)
    {
        ret = socket_recv(sockfd,buf_recv_temp+recv_len,
                        sizeof(buf_recv_temp)-1,0);
        if ( ret <= 0 )
        {
            perror("ERROR:recvive file fail");
            return ret;
        }
        
        if ( recv_len == 0 )
        {

            D(printf("recvive length = %d\n",ret));
            D(printf("\nrecvive : \n%s \n\n",buf_recv_temp));


            download_len = http_get_res_length(buf_recv_temp);


            D(printf("download length = %d\n",download_len));

        }

        recv_len += ret;

        
        D(printf("total receive length = %d\n",recv_len));
        

        if ( download_len == recv_len )
            break;
    }

    memcpy(buf_recv,buf_recv_temp,download_len);
    return recv_len;
}
コード例 #28
0
ファイル: udp.c プロジェクト: leonlee/tome
/*-------------------------------------------------------------------------*\
* Receives data from a UDP socket
\*-------------------------------------------------------------------------*/
static int meth_receive(lua_State *L) {
    p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1);
    char buffer[UDP_DATAGRAMSIZE];
    size_t got, count = (size_t) luaL_optnumber(L, 2, sizeof(buffer));
    int err;
    p_timeout tm = &udp->tm;
    count = MIN(count, sizeof(buffer));
    timeout_markstart(tm);
    err = socket_recv(&udp->sock, buffer, count, &got, tm);
    if (err != IO_DONE) {
        lua_pushnil(L);
        lua_pushstring(L, udp_strerror(err));
        return 2;
    }
    lua_pushlstring(L, buffer, got);
    return 1;
}
コード例 #29
0
ファイル: sys_net.c プロジェクト: Strongc/zhangpengpeng
int socket_recv_timeo(SOCKET sock, char *buf, int len, int *outlen, int msec)
{
	if (sock == NULL || buf == NULL || len == 0)
		return SSS_ERROR;

	fd_set fdset;
	FD_ZERO(&fdset);
	FD_SET(sock, &fdset);

	struct timeval timeout;
	timeout.tv_sec = msec / 1000;
	timeout.tv_usec = msec % 1000;

	if (select(sock + 1, &fdset, NULL, NULL, &timeout) <= 0)
		return SSS_ERROR;

	return socket_recv(sock, buf, len, outlen);
}
コード例 #30
0
static int my_read(int fd, char *ptr){
	int	read_cnt = 0;
	char	*read_ptr;
	char	read_buf[MAXLINE];
	if (read_cnt <= 0) {
again:
		if ((read_cnt = socket_recv(fd, read_buf, sizeof(read_buf), 0)) < 0) {
			if (IS_INTERRUPTED)
				goto again;
			return(-1);
		} else if (read_cnt == 0)
			return(0);
		read_ptr = read_buf;
	}

	read_cnt--;
	*ptr = *read_ptr++;
	return(1);
}