Ejemplo n.º 1
0
/*------------------------------------------------------------------------------------------------------------------
--      FUNCTION: init_udp_recieve
--
--      DATE: Febuary 6 2014
--      REVISIONS: none
--
--      DESIGNER: Ramzi Chennafi
--      PROGRAMMER: Ramzi Chennafi
--
--      INTERFACE: int init_udp_receive(HWND hwnd)
--
--      RETURNS: int, returns values that are dealt with by read_udp. Positive values deem a transfer as over.
--
--      NOTES:
--      Takes a HWND to the parent window.
--
--		Sets up the system to accept a UDP data transfer, reads the packet, acknowledges it and adds it to the main buffer. Once the transfer
--		has been completed a message is printed or the data is saved, based on the specified mode.
----------------------------------------------------------------------------------------------------------------------*/
int init_udp_receive(HWND hwnd){
	DWORD Flags = 0;
	int status;
	char msg[MAX_SIZE];
	SETTINGS * st = (SETTINGS*)GetClassLongPtr(hwnd, 0);

	char ack[6] = ";ACK;";

	char * tempBuffer = (char*)malloc(sizeof(char)* SocketInfo->packet_size);
	SocketInfo->DataBuf.len = SocketInfo->packet_size;
	SocketInfo->DataBuf.buf = tempBuffer;

	if ((status = WSARecvFrom(st->server_socket, &SocketInfo->DataBuf, 1, &SocketInfo->BytesRECV, &Flags, NULL, NULL, NULL, NULL)) == SOCKET_ERROR){
		sprintf_s(msg, "Error %d in TCP WSARecv(data) with return of %d\n", WSAGetLastError(), status);
		activity(msg, EB_STATUSBOX);
		return 0;
	}
	acknowledge(hwnd);

	if (SocketInfo->mode == 0){
		SocketInfo->DataBuf.buf[SocketInfo->BytesRECV - 1] = '\0';
		strcat_s(buffer + SocketInfo->totalRecv, SocketInfo->BytesRECV, SocketInfo->DataBuf.buf);
	}

	SocketInfo->packets -= 1;
	SocketInfo->totalRecv += SocketInfo->BytesRECV;

	if (SocketInfo->totalRecv == SocketInfo->total_size || SocketInfo->packets == 0){
		endTime = GetTickCount();
		seconds = endTime - startTime;
		return transfer_completion(hwnd, SocketInfo->mode);
	}
	return -2; // packets remaining
}
Ejemplo n.º 2
0
std::string SocketUdp::Recv(void)
{
	SOCKADDR_IN sin;

	int len = sizeof(sin);

	char* buff = new char[sizeof(UDPPacket)];
	DWORD flags = 0;
	DWORD ret = 0;
	WSABUF* fb = new WSABUF();
	fb->buf = buff;
	fb->len = sizeof(UDPPacket);


	DWORD error = WSARecvFrom(this->socket_, fb, 1, &ret, &flags, reinterpret_cast<struct sockaddr*>(&sin), &len, 0, 0);
	if (error == SOCKET_ERROR && WSAGetLastError() != WSAEMSGSIZE)
		throw ErrorInOut("Cannot recv data");

	DEBUG << "Receiving complete" << std::endl;

	std::string pack = std::string(buff, ret);

	delete fb;
	delete buff;

	return (pack);
}
Ejemplo n.º 3
0
CHANNEL channel(ENDPOINT ep, QUEUE que) {
	SOCKET s = socket(AF_INET, SOCK_DGRAM, 0);

	unsigned long ul = 1;
	if (ioctlsocket(s, FIONBIO, (unsigned long *)&ul) == SOCKET_ERROR){
	}

	channelimpl * ch = pool::objpool<channelimpl>::allocator(1);
	new (ch) channelimpl(que, s, ep);

	if (ch->que != 0){
		CreateIoCompletionPort((HANDLE)ch->s, ((queueimpl*)((handle*)ch->que))->iocp, 0, 0);

		WSABUF * wsabuf = pool::objpool<WSABUF>::allocator(1);
		wsabuf->buf = ch->buf;
		wsabuf->len = 0;
		DWORD bytes = 0;
		DWORD flags = 0;
		overlappedex * ovp = pool::objpool<overlappedex>::allocator(1);
		new (ovp)overlappedex();
		ovp->h = (handle*)ch;
		ovp->com_type = iocp_type_ipv4_udp;
		ovp->event_type = type_recv;
		OVERLAPPED * ovp_ = static_cast<OVERLAPPED *>(ovp);
		memset(ovp_, 0, sizeof(OVERLAPPED));
		if (WSARecvFrom(ch->s, wsabuf, 1, &bytes, &flags, (sockaddr*)(&((endpointimpl*)ch->from)->addr), &((endpointimpl*)ch->from)->len, ovp_, 0) == SOCKET_ERROR){
			if (WSAGetLastError() != WSA_IO_PENDING){
				return false;
			}
		}
	}

	return (CHANNEL)((handle*)ch);
}
Ejemplo n.º 4
0
bool	UDPWinSocket::Receive_data(ServerMessage *recv_msg)
{
	DWORD				recv_flags = 0;
	DWORD				recv_bytes = 0;
	WSABUF				recvbuff[1];
	char				buff[8192];
	int					server_length;

	recvbuff[0].len = 8192;
	recvbuff[0].buf = buff;
	server_length = (int)sizeof(struct sockaddr_in);

	memset(buff, '\0', 8192);

	/* Receive bytes from client */
	if ((WSARecvFrom(_socket, recvbuff, 1, &recv_bytes, &recv_flags, (struct sockaddr *)&_server, &server_length, NULL, NULL)) == SOCKET_ERROR)
	{
		if (WSAGetLastError() == WSAEWOULDBLOCK)
			return (true);
		else
		{
			std::cerr << "couldn't recv from" << std::endl;
			return (true);
		}
	}
	memcpy(recv_msg, (void *)buff, sizeof(ServerMessage));
	std::cout << "Nom du j1: " << recv_msg->name[J1] << std::endl;
	std::cout << "Nom du j2: " << recv_msg->name[J2] << std::endl;
	std::cout << "Nom du j3: " << recv_msg->name[J3] << std::endl;
	std::cout << "Nom du j4: " << recv_msg->name[J4] << std::endl;
	return (true);
}
Ejemplo n.º 5
0
net_ssize_t net_recvfrom( NET_SOCKET s, void *buf, size_t len, int flags, struct sockaddr* from, socklen_t *fromlen, int timeout )
{
  DWORD readbytes = 0;
  DWORD rflags = ( DWORD )flags;
  BOOL dwRes;
  DWORD selflags;
  WSABUF datadesc = { len, buf };
  
  ResetEvent( s->o.hEvent );
  if( WSARecvFrom( s->s, &datadesc, 1, &readbytes, &rflags, from, fromlen, &s->o, NULL ) == SOCKET_ERROR )
  {
    if( WSAGetLastError() != WSA_IO_PENDING )
      return 0;
  }
  else
    return readbytes;
  
  dwRes = WaitForSingleObject( s->o.hEvent, timeout == NET_INF_TIMEOUT ? INFINITE : timeout );
  if( dwRes == WAIT_OBJECT_0 ) 
  {
    if( !WSAGetOverlappedResult( s->s, &s->o, &readbytes, TRUE, &selflags ) )
      readbytes = 0;
  }
  else if( dwRes == WAIT_TIMEOUT )
  {
    WSAGetOverlappedResult( s->s, &s->o, &readbytes, TRUE, &selflags );
    readbytes = 0;
  }
  
  return readbytes;    
}
Ejemplo n.º 6
0
void UDPSocket::receive(PMSG pMsg) {
    int err = 0;
    DWORD flags = 0;
    DWORD numReceived = 0;
    WSABUF winsockBuff;

    winsockBuff.len = 1024 * 8 + 44;
    winsockBuff.buf = (char*) calloc(winsockBuff.len, sizeof(char));

    if (WSARecvFrom(pMsg->wParam, &(winsockBuff), 1, &numReceived, &flags,
                NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
        if ((err = WSAGetLastError()) != WSA_IO_PENDING) {
            qDebug("UDPSocket::receive(): WSARecv() failed with error %d",
                   err);
            return;
        }
    }

    if (numReceived == 0) {
        return;
    }

    QByteArray writeData(winsockBuff.buf, numReceived);

    // CRITICAL SECTION: Lock mutex here.
    QMutexLocker locker(receiveLock_);
    inputBuffer_->write(writeData);
    locker.unlock();
    // END CRITICAL SECTION: Unlock mutex.

    delete[] winsockBuff.buf;

    emit readyRead();
    emit signalDataReceived(this);
}
Ejemplo n.º 7
0
DWORD WINAPI RecvUDPPack(PVOID)
{
	DWORD dFlag, cbRet;
	int iLen;
	int nRet;
	char achInBuf [BUFSIZE]="";
	WSABUF stWSABuf;
	while(!g_bStop)
	{
		stWSABuf.buf = achInBuf;
		stWSABuf.len = BUFSIZE;
		cbRet = 0;
		iLen = sizeof(g_stSrcAddr);
		dFlag = 0;

		nRet = WSARecvFrom(g_hSock,&stWSABuf,1,&cbRet,&dFlag,(struct sockaddr *)&g_stSrcAddr,&iLen,NULL,NULL);
		if(nRet == SOCKET_ERROR)
		{
			printf("WSARecvFrom() failed, Err:%d\n", WSAGetLastError());
		}
		else 
		{
			g_poMem->InsertUDPData(*(UDP_PACK *)stWSABuf.buf);
        }
	}
	return 0;
}
Ejemplo n.º 8
0
int CChannel::recvfrom(sockaddr* addr, CPacket& packet) const
{
#ifndef WIN32
    msghdr mh;
    mh.msg_name = addr;
    mh.msg_namelen = m_iSockAddrSize;
    mh.msg_iov = packet.m_PacketVector;
    mh.msg_iovlen = 2;
    mh.msg_control = NULL;
    mh.msg_controllen = 0;
    mh.msg_flags = 0;

#ifdef UNIX
    fd_set set;
    timeval tv;
    FD_ZERO(&set);
    FD_SET(m_iSocket, &set);
    tv.tv_sec = 0;
    tv.tv_usec = 10000;
    select(m_iSocket+1, &set, NULL, &set, &tv);
#endif

    int res = (int)recvmsg(m_iSocket, &mh, 0);
#else
    DWORD size = CPacket::m_iPktHdrSize + packet.getLength();
    DWORD flag = 0;
    int addrsize = m_iSockAddrSize;

    int res = WSARecvFrom(m_iSocket, (LPWSABUF)packet.m_PacketVector, 2, &size, &flag, addr, &addrsize, NULL, NULL);
    res = (0 == res) ? size : -1;
#endif

    if (res <= 0)
    {
        packet.setLength(-1);
        return -1;
    }

    packet.setLength(res - CPacket::m_iPktHdrSize);

    // convert back into local host order
    //for (int i = 0; i < 4; ++ i)
    //   packet.m_nHeader[i] = ntohl(packet.m_nHeader[i]);
    uint32_t* p = packet.m_nHeader;
    for (int i = 0; i < 4; ++ i)
    {
        *p = ntohl(*p);
        ++ p;
    }

    if (packet.getFlag())
    {
        for (int j = 0, n = packet.getLength() / 4; j < n; ++ j)
            *((uint32_t *)packet.m_pcData + j) = ntohl(*((uint32_t *)packet.m_pcData + j));
    }

    return packet.getLength();
}
Ejemplo n.º 9
0
static AJ_Status AJ_ARDP_UDP_Recv(void* context, uint8_t** data, uint32_t* recved, uint32_t timeout)
{
    NetContext* ctx = (NetContext*) context;
    DWORD ret = SOCKET_ERROR;
    WSAEVENT events[2];
    DWORD flags = 0;
    static uint8_t buffer[UDP_SEGBMAX];

    *data = NULL;

    if (wsaOverlapped.hEvent == INVALID_HANDLE_VALUE) {
        wsbuf.len = sizeof(buffer);
        wsbuf.buf = buffer;
        memset(&wsaOverlapped, 0, sizeof(WSAOVERLAPPED));
        wsaOverlapped.hEvent = recvEvent;
        ret = WSARecvFrom(ctx->udpSock, &wsbuf, 1, NULL, &flags, NULL, NULL, &wsaOverlapped, NULL);
        if ((ret == SOCKET_ERROR) && (WSAGetLastError() != WSA_IO_PENDING)) {
            AJ_ErrPrintf(("WSARecvFrom(): failed WSAGetLastError()=%d\n", WSAGetLastError()));
            return AJ_ERR_READ;
        }
    }

    events[0] = wsaOverlapped.hEvent;
    events[1] = interruptEvent;

    ret = WSAWaitForMultipleEvents(2, events, FALSE, timeout, TRUE);
    switch (ret) {
    case WSA_WAIT_EVENT_0:
        flags = 0;
        if (WSAGetOverlappedResult(ctx->udpSock, &wsaOverlapped, recved, TRUE, &flags)) {
            WSAResetEvent(wsaOverlapped.hEvent);
            wsaOverlapped.hEvent = INVALID_HANDLE_VALUE;
            *data = buffer;
            return AJ_OK;
        } else {
            AJ_ErrPrintf(("AJ_ARDP_UDP_Recv(): WSAGetOverlappedResult error; WSAGetLastError()=%d\n", WSAGetLastError()));
            return AJ_ERR_READ;
        }
        break;

    case WSA_WAIT_EVENT_0 + 1:
        WSAResetEvent(interruptEvent);
        return AJ_ERR_INTERRUPTED;

    case WSA_WAIT_TIMEOUT:
        return AJ_ERR_TIMEOUT;
        break;

    default:
        AJ_ErrPrintf(("AJ_ARDP_UDP_Recv(): WSAWaitForMultipleEvents error; WSAGetLastError()=%d\n", WSAGetLastError()));
        return AJ_ERR_READ;
    }
}
Ejemplo n.º 10
0
/*------------------------------------------------------------------------------------------------------------------
-- FUNCTION: receiveUDP
-- DATE:	14/04/16
-- REVISIONS:	(V1.0)
-- DESIGNER:	Martin Minkov
-- PROGRAMMER:  Martin Minkov
-- INTERFACE:	int receiveUDP(LPSOCKET_INFORMATION SI, sockaddr_in server, DWORD RecvBytes, DWORD Flags)
--
--
-- RETURNS: int
            - 1 if the function is successfull, otherwise 0 if it fails
-- NOTES: Call to initialize the circular buffer.
----------------------------------------------------------------------------------------------------------------------*/
int receiveUDP(LPSOCKET_INFORMATION SI, sockaddr_in server, DWORD RecvBytes, DWORD Flags)
{
    int server_len;
    server_len = sizeof(streamServer);
    if (WSARecvFrom(SI->Socket, &(SI->DataBuf), 1, &RecvBytes, &Flags, (struct sockaddr *)&streamServer, &server_len, &(SI->Overlapped), ServerRoutine) == SOCKET_ERROR)
    {
        if (WSAGetLastError() != WSA_IO_PENDING)
        {
            return FALSE;
        }
    }
    return TRUE;
}
Ejemplo n.º 11
0
void async_recvfrom(SOCKET s, char * buff, const uint32_t buflen, boost::function<void(char * buff, uint32_t len, const address & addr) > recvfromcallback){
	WSABUF * pWSABUF = GetWSABUF(1);
	pWSABUF->buf = buff;
	pWSABUF->len = buflen;

	overlappedrecvfrom * poverlappedrecvfrom = static_cast<overlappedrecvfrom*>(GetOverlapped(event_recv));
	poverlappedrecvfrom->fncallback = boost::bind(recvfromcallback, buff, _1, _2);
	
	DWORD bytes = 0;
	if (SOCKET_ERROR == WSARecvFrom(s, pWSABUF, 1, &bytes, 0, (sockaddr*)&poverlappedrecvfrom->remoteaddr, &poverlappedrecvfrom->addrlen, &poverlappedrecvfrom->ovlap, 0)){
		int err = WSAGetLastError();
		if (err != ERROR_IO_PENDING){
			throw exception::RecvfromException("Recvfrom fail", err);
		}
	}
}
Ejemplo n.º 12
0
/* read operation on common fd (udp)
 * @Handle -- the common fd
 * @Dst -- destination address information
 * @DstLen -- sizeof Dst
 * @Buffer -- data buffer
 * @BufferSize -- buffer size in bytes
 * @Callback -- callback function when read successful
 * @Args -- argument to callback
 * return TRUE -- success, else error
 */
BOOL 
CommIOCPUdpRead(
    COMMFD_HANDLE Handle, 
    PSOCKADDR Dst,
    PINT DstLen,
    PBYTE Buffer, 
    DWORD BufferSize, 
    READ_CALLBACK Callback,
    PVOID Args
    )
{
    INT Ret;
    PCOMMIOCP CommIOCP;
    DWORD Flags = MSG_PARTIAL, Bytes = 0;
    PCOMM_SOCKET_IO_CTX IOData;
    PCOMMFD Commfd = (PCOMMFD)Handle;

    if (!Callback || !Commfd || Commfd->Type != COMM_UDP || Commfd->Handle.Socket == INVALID_SOCKET) {
        LOG_ERROR("bad args");
        return (FALSE);
    }

    CommIOCP = Commfd->CommIOCP;
    
    IOData = (PCOMM_SOCKET_IO_CTX)CommIOCPIOCtxCreate(Commfd->CommIOCP, IO_SOCK_READ);
    if (IOData == NULL) {
        LOG_ERROR("create socket IO context failed");
        return (FALSE);
    }

    IOData->WSABuffer.buf = (CHAR *)Buffer;
    IOData->WSABuffer.len = BufferSize;
    IOData->Data.Callback.Read = Callback;
    IOData->Data.Args = Args;

    CommIOCPFDAddRef(Commfd);
    Ret = WSARecvFrom(Commfd->Handle.Socket, &IOData->WSABuffer, 1, &Bytes, &Flags, Dst, DstLen, &IOData->Data.OL, NULL);

    if (Ret == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING) {
        LOG_ERROR("WSARecvFrom failed [%d]", WSAGetLastError());
        CommIOCPIOCtxDestroy(Commfd->CommIOCP, &IOData->Data);
        CommIOCPFDRelease(Commfd);
        return (FALSE);
    }

    return (TRUE);
}
Ejemplo n.º 13
0
int WinSocket::recDataFrom(std::string & buffer , int blocksize)
{
	WSABUF Databuf;
	DWORD receive;
	struct sockaddr_in in;
	char buf[1024];
	int len;

	Databuf.len = blocksize + 1;
	Databuf.buf = buf;
	receive = blocksize;
	int size = sizeof(in);
	if ((len = WSARecvFrom(this->sock, &Databuf, 1, &receive, 0, (SOCKADDR *)& in, &size, 0, 0)) ==  SOCKET_ERROR)
		return (-1);
	buffer = Databuf.buf;
	return len;
}
Ejemplo n.º 14
0
Network::Packet*	Network::UDPSocketWindows::recvPacket(struct sockaddr *sockAddr) const
{
  Network::Content	content;
  int					addrlen;
  WSABUF			buf;
  DWORD				bytes;
  DWORD				flags = 0;

  buf.buf = reinterpret_cast<char *>(&content);
	memset((void*)&content, 0, 256);
  buf.len = 256;
  addrlen = sizeof(*((struct sockaddr_in*)sockAddr));
  if (WSARecvFrom(this->fd_, &buf, 1, &bytes, &flags,	sockAddr, &addrlen, NULL, NULL) == SOCKET_ERROR || bytes <= 0)
    return (NULL);
	Packet *packet = new Packet(content);
  return packet;
}
Ejemplo n.º 15
0
int aio_socket_recvfrom_v(aio_socket_t socket, socket_bufvec_t* vec, int n, aio_onrecvfrom proc, void* param)
{
	DWORD flags = 0;
	struct aio_context *ctx = (struct aio_context*)socket;
	struct aio_context_action *aio;

	aio = util_alloc(ctx);
	aio->action = iocp_recvfrom;
	aio->recvfrom.proc = proc;
	aio->recvfrom.param = param;
	aio->recvfrom.addrlen = sizeof(aio->recvfrom.addr);

	assert(0 == (AIO_READ & InterlockedOr(&ctx->flags, AIO_READ)));
	if(SOCKET_ERROR == WSARecvFrom(ctx->socket, vec, (DWORD)n, NULL/*&dwBytes*/, &flags, (struct sockaddr *)&aio->recvfrom.addr, &aio->recvfrom.addrlen, &aio->overlapped, NULL))
	{
		return aio_socket_result(aio, AIO_READ);
	}
	return 0;
}
Ejemplo n.º 16
0
int
enet_socket_receive (ENetSocket socket,
                     ENetAddress * address,
                     ENetBuffer * buffers,
                     size_t bufferCount)
{
    INT sinLength = sizeof (struct sockaddr_in);
    DWORD flags = 0,
          recvLength;
    struct sockaddr_in sin;
	memset(&sin, 0, sizeof sin);

    if (WSARecvFrom (socket,
                     (LPWSABUF) buffers,
                     (DWORD) bufferCount,
                     & recvLength,
                     & flags,
                     address != NULL ? (struct sockaddr *) & sin : NULL,
                     address != NULL ? & sinLength : NULL,
                     NULL,
                     NULL) == SOCKET_ERROR)
    {
       switch (WSAGetLastError ())
       {
       case WSAEWOULDBLOCK:
       case WSAECONNRESET:
          return 0;
       }

       return -1;
    }

    if (flags & MSG_PARTIAL)
      return -1;

    if (address != NULL)
    {
        address -> host = (enet_uint32) sin.sin_addr.s_addr;
        address -> port = ENET_NET_TO_HOST_16 (sin.sin_port);
    }

    return (int) recvLength;
}
Ejemplo n.º 17
0
/*
 * Threaded recvfrom
 */
static
ssize_t
Nrecvfrom(int fd, void* buf, size_t len, int flags,
          struct sockaddr* from, int* fromlen)
{
    ssize_t r;
    int ret;
    WSABUF wbuf;

    wbuf.len = (u_long)len;
    wbuf.buf = (char FAR*)buf;

    ret = WSARecvFrom(fhand[fd].sock, &wbuf, 1, &r, &flags,
                      from, fromlen, NULL, NULL);

    if (ret == SOCKET_ERROR) {
        return (-1);
    }
    return (r);
}
Ejemplo n.º 18
0
ISocket					*CWSocket::receivUdp(char *message, int size, int *received)
{
	sockaddr_in			tmpInfo;
	int					sizeTmp = sizeof(tmpInfo);
	DWORD				flags;
	WSABUF				dataBuf;

	if ((this->_type != ISocket::UDP) || (this->_sock == -1) || (this->_func == ISocket::CLIENT))
		throw Exception("This socket type isn't valid.");
	if (this->_func == ISocket::NONE)
		throw Exception("This socket type isn't initialized.");
	CWSocket			*newSocket = new CWSocket(this);
	dataBuf.buf = message;
	dataBuf.len = size;
	flags = 0;
	if (WSARecvFrom(this->_sock, &dataBuf, 1, (DWORD *)received, &flags, (SOCKADDR*)&tmpInfo, &sizeTmp, NULL, NULL) != 0)
		throw Exception("WSARecvFrom has failed.");
	newSocket->setInfo(tmpInfo);
	return (newSocket);
}
Ejemplo n.º 19
0
int		UDPClientSocketWindows::SNRead(char *msg, unsigned int size)
{
	WSABUF	DataBuff;
	DWORD	BytesReceived;
	struct sockaddr_in from;
	DWORD   Flags = 0;
	int	structsize;

	structsize = sizeof(from);
	DataBuff.buf = (msg);
	DataBuff.len = size;
	if (WSARecvFrom(this->_socket, &DataBuff, 1, &BytesReceived, &Flags, (SOCKADDR *)&(from), &structsize, NULL, NULL) == SOCKET_ERROR)
	//	if (WSARecvFrom(this->_socket, &DataBuff, 1, &BytesReceived, &Flags, (SOCKADDR *)&(from), &structsize, NULL, NULL) == SOCKET_ERROR)
	{
		this->_error = CANTREAD;
		return (-1);
	}
	this->_error = NOERRORSOCKET;
	return (BytesReceived);
}
Ejemplo n.º 20
0
// Receives an UDP packet. Returns length of received message, or 0 if nothing is received.
 int ioHelperRecvFrom(struct s_io_handle *handle, unsigned char *recv_buf, const int recv_buf_size, struct sockaddr *source_sockaddr, socklen_t *source_sockaddr_len) {
	int len;

#if defined(IO_LINUX) || defined(IO_BSD)

	len = recvfrom(handle->fd, recv_buf, recv_buf_size, 0, source_sockaddr, source_sockaddr_len);

#elif defined(IO_WINDOWS)

	WSABUF wsabuf;
	DWORD flags;

	len = 0;
	wsabuf.buf = (char *)recv_buf;
	wsabuf.len = recv_buf_size;
	flags = 0;
	if(!(handle->ovlr_used)) {
		if(WSARecvFrom(handle->fd, &wsabuf, 1, NULL, &flags, source_sockaddr, source_sockaddr_len, &handle->ovlr, NULL) == 0) {
			handle->ovlr_used = 1;
		}
		else {
			if(WSAGetLastError() == WSA_IO_PENDING) {
				handle->ovlr_used = 1;
			}
		}
	}

#else

	#error not implemented
	len = 0;

#endif

	if(len > 0) {
		return len;
	}
	else {
		return 0;
	}
}
Ejemplo n.º 21
0
static ngx_int_t
ngx_event_post_one_udp_recv(ngx_listening_t *ls, ngx_udp_recv_event_t *event)
{
    int        rc;
    DWORD      flags;
    WSABUF     wsabuf;
    ngx_err_t  err;

    event->pool = ngx_create_pool(ls->pool_size, ngx_cycle->log);
    if (event->pool == NULL) {
        return NGX_ERROR;
    }

    event->buffer = ngx_create_temp_buf(event->pool, ls->udp_recv_buffer_size);
    if (event->buffer == NULL) {
        ngx_destroy_pool(event->pool);
        return NGX_ERROR;
    }

    wsabuf.buf = (CHAR *) event->buffer->last;
    wsabuf.len = (DWORD) (event->buffer->end - event->buffer->last);

    flags = 0;

    event->socklen = NGX_SOCKADDRLEN;

    rc = WSARecvFrom(ls->connection->fd, &wsabuf, 1, NULL, &flags,
                     (struct sockaddr *) event->sockaddr,
                     (LPINT) &event->socklen,
                     (LPWSAOVERLAPPED) &event->event.ovlp, NULL);

    err = ngx_socket_errno;

    if (rc == SOCKET_ERROR && err != WSA_IO_PENDING) {
        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, err,
                      "WSARecvFrom() failed");
        return NGX_ERROR;
    }

    return NGX_OK;
}
Ejemplo n.º 22
0
	return len;
}

int			WinSocket::sendBinary(void *point, int len)
{
	WSABUF Databuf;
	Databuf.len = len;
	Databuf.buf = (CHAR * )point;

	if (WSASend(this->sock, &Databuf, 1, &Databuf.len, 0,0,0) == SOCKET_ERROR)
		return NULL;
	return 0;
}

int WinSocket::recBinaryFrom(void* buffer , int blocksize, std::string &ip)
{
	WSABUF Databuf;
	DWORD receive;
	struct sockaddr_in in;
	int len;
Ejemplo n.º 23
0
void		GSocketUdpServer::Receive(void *s, unsigned int size)
{
#if defined (GWIN)
	int		ret;
	int		len = sizeof(this->_sockaddr);
	DWORD	dwBytesRet, dwFlags;
	WSABUF	wbuf;
	wbuf.len = size;
	wbuf.buf = (char *)s;
	dwFlags = 0;
	ret = WSARecvFrom(this->_socket, &wbuf, 1, &dwBytesRet, &dwFlags, reinterpret_cast <sockaddr*> (&this->_sockaddr), &len, NULL, NULL);
	if (ret == 0)
		return ;
	throw GException("GSocketUdpSever", "Error WSARecvFrom");
#else
	int	li = 0;
	li = recvfrom(this->_socket, s, size, 0, 0, 0);
	if (li <= 0)
		throw GException("GSocketUdpServer", "Error recvfrom");
#endif
}
Ejemplo n.º 24
0
void SessionUDP::DoAsyncRecv()
{

#ifdef VHWD_WINDOWS


	TempPtrT<MyOverLappedEx> q=lkfq_recv.getq();
	if(!q)
	{
		return;
	}

	MyOverLappedEx &idat(*q);

	int bRet=WSARecvFrom(sk_local.sock,
						 &idat.dbuf[0],
						 idat.dbuf[1].buf?2:1,
						 &idat.size,
						 &iocp_flag_recv,
						 idat.peer,
						 idat.peer,
						 &idat.olap,
						 NULL);

	if(bRet!=0 && WSAGetLastError()!=WSA_IO_PENDING)
	{
		--m_nPendingRecv;
		Disconnect();
		return;
	}
	else
	{
		q.release();
	}

#else
	ep_ctl(EPOLLIN);
#endif
}
Ejemplo n.º 25
0
bool socket_t::b_recfrom()
{
	bool result;

	int ret = WSARecvFrom();

	if(ret == SOCKET_ERROR) {
		int socket_error = _WSAGetLastError();
		if(socket_error == WSA_IO_PENDING) {
			D(bug("WSARecvFrom() i/o pending\r\n"));
			result = true;
		} else {
			D(bug("_WSAGetLastError() returned %d\r\n", socket_error));
			result = false;
		}
	} else /*if(ret == 0) */ {
		D(bug("WSARecvFrom() ok\r\n"));
		// Completion routine call is already scheduled.
		result = true;
	}
	return result;
}
Ejemplo n.º 26
0
int
enet_socket_receive (ENetSocket socket,
                     ENetAddress * address,
                     ENetBuffer * buffers,
                     size_t bufferCount)
{
    INT length = sizeof (struct sockaddr_in6);
    DWORD flags = 0,
          recvLength;

    if (WSARecvFrom (socket,
                     (LPWSABUF) buffers,
                     (DWORD) bufferCount,
                     & recvLength,
                     & flags,
                     address != NULL ? (struct sockaddr *) address : NULL,
                     address != NULL ? & length : NULL,
                     NULL,
                     NULL) == SOCKET_ERROR)
    {
       switch (WSAGetLastError ())
       {
       case WSAEWOULDBLOCK:
       case WSAECONNRESET:
          return 0;
       }

       return -1;
    }

    if (flags & MSG_PARTIAL)
      return -1;

    if (address != NULL)
        address -> port = ENET_NET_TO_HOST_16 (address -> port);

    return (int) recvLength;
}
Ejemplo n.º 27
0
void CWin32Socket::ReceiveFrom(TWin32Message& aMessage)
	{
	__ASSERT_DEBUG(iReceiveMessage == NULL, Panic(EWinSockPrtCWin32SocketMultipleReceiveFromRequests));
	iReceiveMessage = &aMessage;
	WSP_LOG(WspLog::Printf(_L("CWin32Socket::ReceiveFrom: this: 0x%x, bytes to get: %d"), this, iReceiveMessage->WriteBuffer().MaxLength()));
	iReceiveBuffer.buf = reinterpret_cast<char*>(const_cast<TUint8*>(iReceiveMessage->WriteBuffer().Ptr()));
	iReceiveBuffer.len = iReceiveMessage->WriteBuffer().MaxLength();
	iFlags = 0;
	iReceiveOverlapped.hEvent = (void*) this;
	iReceiveFromAddressLength = sizeof(struct sockaddr_in);
	iReceiveFromClientAddress = (TInetAddr*)iReceiveMessage->ReadBuffer().Ptr();
	DWORD numberOfBytesReceived;
	TInt ret = WSARecvFrom(iSocket, &iReceiveBuffer, 1, &numberOfBytesReceived, &iFlags, (LPSOCKADDR)&iReceiveFromAddress, &iReceiveFromAddressLength, &iReceiveOverlapped, &ReceiveFromCompletion);
	if (ret == SOCKET_ERROR)
		{
		TInt err = WSAGetLastError();
		if (err != WSA_IO_PENDING)
			{
			WSP_LOG(WspLog::Printf(_L("\tsocket error: %d"), err));
			Complete(iReceiveMessage, MapWinSockError(err));
			}
		}
	}
Ejemplo n.º 28
0
        virtual result_t process()
        {
            int32_t nError;

            m_DataBuf.len = (DWORD)m_buf.length();
            m_DataBuf.buf = &m_buf[0];
            m_dwFlags = 0;
            sz = sizeof(addr_info);

            if (WSARecvFrom(m_s, &m_DataBuf, 1, NULL, &m_dwFlags,
                            (sockaddr*)&addr_info, &sz, this, NULL) != SOCKET_ERROR)
                return CHECK_ERROR(CALL_E_PENDDING);

            nError = GetLastError();

            if (nError == ERROR_BROKEN_PIPE)
                return CALL_RETURN_NULL;

            if (nError == ERROR_IO_PENDING)
                return CHECK_ERROR(CALL_E_PENDDING);

            return CHECK_ERROR(-nError);
        }
Ejemplo n.º 29
0
/**
 * \brief The Windows implementation of readv() socket helper function.
 * \param fd the socket descriptor to read the data.
 * \param iov the iovector to store the data.
 * \param iovcnt number of element that should be filled.
 * \param addr if not NULL it considers using a UDP socket, otherwise it
 * considers using a TCP one.
 * \param addr_size pointer on address size, will be filled by this function.
 * \return number of bytes read or -1 if error.
 * \warning this function work only with socket!
 */
static ssize_t net_sock_readv_win(int fd, const struct iovec *iov,
    size_t iovcnt, const struct sockaddr* addr, socklen_t* addr_size)
{
  WSABUF winiov[iovcnt];
  DWORD winiov_len = iovcnt;
  size_t i = 0;
  DWORD ret = 0;

  if(iovcnt > sizeof(winiov))
  {
    return -1;
  }

  for(i = 0 ; i < iovcnt ; i++)
  {
    winiov[i].len = iov[i].iov_len;
    winiov[i].buf = iov[i].iov_base;
  }

  if(addr) /* UDP case */
  {
    if(WSARecvFrom(fd, winiov, winiov_len, &ret, NULL, (struct sockaddr*)addr,
          addr_size, NULL, NULL) != 0)
    {
      return -1;
    }
  }
  else /* TCP case */
  {
    if(WSARecv(fd, winiov, winiov_len, &ret, NULL, NULL, NULL) != 0)
    {
      return -1;
    }
  }

  return (ssize_t)ret;
}
Ejemplo n.º 30
0
/*------------------------------------------------------------------------------------------------------------------
--      FUNCTION: process_header
--
--      DATE: Febuary 6 2014
--      REVISIONS: none
--
--      DESIGNER: Ramzi Chennafi
--      PROGRAMMER: Ramzi Chennafi
--
--      INTERFACE: int process_header(HWND hwnd, SOCKET recv), takes the parent HWND as an argument and the socket the header was sent to.
--
--      RETURNS: void
--
--      NOTES:
--      Retrieves the header datagram from the passed in socket. If using TCP, just grabs it. If on UDP, the header is grabbed then
--		acknowledged. If no header is successfully grabbed, the function is called on every WM_SOCKET message until it is.
----------------------------------------------------------------------------------------------------------------------*/
int process_header(HWND hwnd, SOCKET recv){

	SETTINGS * st = (SETTINGS*)GetClassLongPtr(hwnd, 0);
	DWORD RecvBytes = 0, Flags = 0;
	int status, server_len;
	struct	sockaddr_in server;

	char msg[MAX_SIZE];
	char * hdBuffer = (char*)malloc(sizeof(char)* HEADER_SIZE);
	memset(hdBuffer, 0, HEADER_SIZE);

	LPWSABUF wsaBuffer = (LPWSABUF)malloc(sizeof(WSABUF));
	wsaBuffer->len = HEADER_SIZE;
	wsaBuffer->buf = hdBuffer;

	if (st->protocol == TCP){
		if ((status = WSARecv(recv, wsaBuffer, 1, &RecvBytes, &Flags, NULL, NULL)) == SOCKET_ERROR){
			sprintf_s(msg, "Error %d in TCP WSARecv(header) with return of %d\n", WSAGetLastError(), status);
			activity(msg, EB_STATUSBOX);
		}

		if (wsaBuffer->buf[0] != ';'){ // I really should have used an uncommon character here
			return -1;
		}
	}
	else{
		server_len = sizeof(server);
		if ((status = WSARecvFrom(st->server_socket, wsaBuffer, 1, &RecvBytes, &Flags, (struct sockaddr *)&server, &server_len, NULL, NULL)) == SOCKET_ERROR){
			return -1;
		}
		acknowledge(hwnd);
	}

	grab_header_info(hdBuffer);
	return 1;
}