Exemple #1
0
static unsigned int	
__recv (SOCKET *self)
{
	/* Initialize */
	BUFFER *ff = NULL; 
	int rcvd = 0;
	int rd = 0;
	socket_t *sock = self->data;
	char msg[(const int)sock->bufsz];
	unsigned int ws = sock->bufsz - 1;

#if 1
	#define CC "child"
	#define SS "server"
	#define CL "client"
	char c = sock->_class;
	fprintf(stderr, "tcp socket buffer: %p (%s)\n", \
		ff, (c=='c') ? CL : (c=='d') ? CC : SS);
#endif

	/* Create a new fresh buffer (clean this up...) */
	if (!(ff = NEW(buffer)(binary, 0)))
		return errstat(0, "Failed to create buffer for socket data.");
		
#if 1
	fprintf(stderr, "Current size: %d\n", ff->size(ff));
	fprintf(stderr, "tcp socket buffer is now: %p (%s)\n", \
		ff, (c=='c') ? CL : (c=='d') ? CC : SS);
#endif
	sock->buffer = ff;

	/* Use a buffer and connection here */
	switch (sock->connection_type) 
	{
		case SOCK_STREAM:
			/* If it's -1, die.  If it's less than buffer, die */
			while (1) {
				rcvd = recv(sock->fd, &msg, ws, 0);
				rd += rcvd;
				vvprintf("rcvd %d bytes so far\n", rd);
			#if 0
				int c = 0;
				for (c=0;c<(ws > rcvd ? rcvd : ws); c++) 
					fprintf(stderr, "'%c' ", msg[c]);
			#endif

				/* Error occurred, free or reset the buffer and die */
				if (rcvd == -1)
					return errsys("recv() error occurred");
				/* End of message reached before end of buffer */
				else if (rcvd < ws) {	
					ff->append(ff, msg, rcvd);
					vvprintf("Finally rcvd %d bytes.", rd);
					vvprintf("Current buffer size: %d\n", ff->contents(ff)->size);
					return SUCCESS;
				}

				/* Write the entire buffer otherwise */
				ff->append(ff, msg, ws);
			}
				
#if 0
		case SOCK_DGRAM:
			rcvd = recvfrom(sock->fd, msg, ws, 0,
				NULL, NULL);
				//sock->cliaddr, &sock->cliaddrlen);

			if (rcvd == -1) return 0;
			msg[rcvd] = 0;
			fprintf(stderr, "udp recv'd bytes: %d\n", rcvd);
			fprintf(stderr, "%s\n", msg);	

			while (1) {
				rcvd = recvfrom(sock->fd, msg, ws, 0,
					NULL, NULL);
				fprintf(stderr, "udp recv'd bytes: %d\n", rcvd);
				fprintf(stderr, "%s\n", msg);	

				if (rcvd == -1)
					return 0;  // return false and sock->error = errno;
				if (rcvd < ws)
					break;	
			}
			return 1;
#endif

		default:
			fprintf(stderr, "%s\n", "Got unknown socket option.");
			return 0;	
	}

	return SUCCESS;
}