Re: call is blocked in recvfrom() and no further proceedings in Wi
- From: "Paul G. Tobey [eMVP]" <ptobey no spam AT no instrument no spam DOT com>
- Date: Wed, 16 Nov 2005 08:24:39 -0700
You can't do it through ActiveSync. It doesn't forward those packets.
Using a real network adapter will work fine, but ActiveSync was not designed
to be a substitute for networking...
Paul T.
"Sudha.v" <Sudhav@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:4D4262DD-6E96-4B78-B0DB-BEF8303E8669@xxxxxxxxxxxxxxxx
>I have a sample UDP application which is working in emulator. I tried same
> way for this(i.e., for the program which I have shown here) also. But it's
> giving the same error. I have connected my device through Active Sync
> only.
> If Active Sync doesn't support UDP means, how to implement applications
> which uses UDP(for ex. VoIP, PTT/PoC(Push to Talk)?.
>
> --
> Attempting half-heartedly is like expecting failure and achieving it.
>
>
> "Paul G. Tobey [eMVP]" wrote:
>
>> How is the Windows CE device connected to the network where the desktop
>> machine is? Don't say ActiveSync; that won't work with UDP. I don't
>> have
>> any examples of datagram operations, except some for multicasting, sorry.
>>
>> Paul T.
>>
>> "Sudha.v" <Sudhav@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
>> news:EC61B1D6-D21D-4537-9F3F-B4BD42935A6D@xxxxxxxxxxxxxxxx
>> > Hi Paul,
>> > Thanks for ur reply. I have tested it on real device (Samsung). But no
>> > luck
>> > application is exiting when it reaches recvfrom().
>> >
>> > i=recvfrom(s1,packetbuffer,sizeof(packetbuffer),0,(SOCKADDR
>> > *)&addr,&cbRemoteAddrSize);
>> >
>> > This is the code I'm using. I changed many things from the previous
>> > code
>> > for
>> > testing purpose. Just have a look at the code and let me know u can
>> > find
>> > something on it.
>> > If there is any sample program for udp please let me know.
>> > Your help is greatly appreciated.
>> >
>> > Thanks,
>> >
>> >
>> >
>> > --
>> > Attempting half-heartedly is like expecting failure and achieving it.
>> >
>> >
>> > "Paul G. Tobey [eMVP]" wrote:
>> >
>> >> What happens on a *real device*. I don't trust the emulator for this
>> >> type
>> >> of thing. It's not a real device; its network stack is running on top
>> >> of
>> >> the real stack on the PC, etc.
>> >>
>> >> Paul T.
>> >>
>> >> "Sudha.v" <Sudhav@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
>> >> news:D84E9754-AA07-45B1-845A-3EEAADA4D5E7@xxxxxxxxxxxxxxxx
>> >> > In the below code, application simply keeps on waiting for incoming
>> >> > data(Means, call is blocked in recvfrom() and no further
>> >> > proceedings).
>> >> > Environment : EVC++ 4.0, Smart phone 2003 SDK Emulator.
>> >> > Simple intro about the application.
>> >> > An NT service is running in my system(PC) which is nothing but the
>> >> > server.
>> >> > My program has to send request to service through port 5070(in this
>> >> > port
>> >> > only
>> >> > server is receiving the requests). Depending upon request, server
>> >> > will
>> >> > send
>> >> > response back to the program in port 5090. and application uses UDP.
>> >> > · So In the code, socket "s" will send request to NT service.
>> >> > · And "sock" will receive the response.
>> >> > · Everything seems to be OK. But during debugging the application
>> >> > infinitely
>> >> > waiting in recvfrom() call. This call is not at all returning.
>> >> > But the same code is working in windows. Only in Windows CE it is
>> >> > not
>> >> > working.
>> >> > In order to find whether data is available in the port or not, I
>> >> > have
>> >> > done
>> >> > the following.
>> >> > · Sent data from Windows CE(i.e., socket is created in EVC++ 4.0 to
>> >> > send
>> >> > request to NT service).
>> >> > · Received the response in Windows(means, for reception I created
>> >> > socket
>> >> > in
>> >> > VC++ 6.0 and data is successfully received).
>> >> > · From the above two steps, I'm clear that, data is available in the
>> >> > specific port (i.e, in 5090).
>> >> > So, the issue is in Windows CE, recvfrom() call is infinitely
>> >> > waiting
>> >> > and
>> >> > not returning even though the packet is available in the specific
>> >> > net
>> >> > work
>> >> > address.
>> >> > You may be annoyed of seeing this bulk of code. But I'm desperately
>> >> > in
>> >> > need
>> >> > of the solution. So, please have a look at the code. Your help is
>> >> > greatly
>> >> > appreciated.
>> >> >
>> >> > #include <stdio.h>
>> >> > #include <stdlib.h>
>> >> > #include <malloc.h>
>> >> >
>> >> > #include <windows.h>
>> >> > #include <windowsx.h>
>> >> > #include <winsock2.h>
>> >> > #include <ws2tcpip.h>
>> >> > #include <string.h>
>> >> > #define DEFAULT_FAMILY AF_UNSPEC
>> >> > #define DEFAULT_SOCKTYPE SOCK_DGRAM
>> >> > #define DEFAULT_PORT "5090"
>> >> > #define BUFFER_SIZE 23 // length of "WinCE
>> >> > Echo
>> >> > Test Packet"
>> >> > #define TIMEOUT_SECS 2
>> >> > #define TIMEOUT_USECS 0
>> >> > SOCKET sock = INVALID_SOCKET;
>> >> > int nFamily = DEFAULT_FAMILY;
>> >> > int nSockType = DEFAULT_SOCKTYPE;
>> >> > char szRemoteName[64] = "INFBA01803";
>> >> > char *szPort = DEFAULT_PORT;
>> >> > SOCKADDR_STORAGE ssRemoteAddr;
>> >> > int cbXfer, cbTotalRecvd, cbRemoteAddrSize;
>> >> > WSADATA wsaData;
>> >> > ADDRINFO Hints, *AddrInfo = NULL, *AI;
>> >> > char szRemoteAddrString[128];
>> >> > fd_set fdReadSet;
>> >> > TIMEVAL timeout = {TIMEOUT_SECS, TIMEOUT_USECS};
>> >> > char pRecvBuf[BUFFER_SIZE];
>> >> > struct ip_mreq mreq;
>> >> > SOCKET sock, SockServ[FD_SETSIZE];
>> >> > fd_set fdSockSet;
>> >> > int nNumSocks, nNumSocksCount;
>> >> > char pBuf[] = "WinCE Echo Test Packet";
>> >> > int iReceiveStatus;
>> >> >
>> >> > //Change these if required
>> >> > #define USERNAME "sudhagar" //TODO
>> >> > #define PWD "nopass" //TODO
>> >> > #define INV_TO "sandeep" //TODO
>> >> > #define IP_SERVER "172.29.12.154"//TODO
>> >> > #define PORT_SERVER "5070" //TODO
>> >> > TIMEVAL ReceiveTimeout;
>> >> > int iRC = 0;
>> >> > int iSendStatus = 0;
>> >> > int SIPlib_main()
>> >> > {
>> >> > int i=0,j=0,k,infop1;
>> >> > char *reg_dest,*inv_dest,*bhr= NULL ,*nnop1;
>> >> > int x=0,reg_id=-1;
>> >> > char tmp[200],locip[50];
>> >> > unsigned int addr2=0;
>> >> > osip_proxy_authorization_t *proxy_auth;
>> >> > int cbXfer, cbTotalRecvd, cbRemoteAddrSize;
>> >> > TCHAR *str;
>> >> > SOCKET s,s1;
>> >> > struct sockaddr_in addr,addr1;
>> >> > char packetbuffer[1200]={{'\0'}},packetbuffer1[1000]={{'\0'}};
>> >> > WSADATA dat ;
>> >> >
>> >> > ///////////////
>> >> > SOCKET SIPRTPSOC;
>> >> > struct sockaddr_in addr21;
>> >> > char nextnon1[50];
>> >> > char *buf2;
>> >> > buf2=(char*)malloc(8*sizeof(char));
>> >> > ///////////////
>> >> > //End of variable declarations
>> >> >
>> >> > if(WSAStartup(MAKEWORD(2,2), &wsaData))
>> >> > {
>> >> > return 1;
>> >> > }
>> >> > sock = INVALID_SOCKET;
>> >> > for(i = 0; i < FD_SETSIZE; i++)
>> >> > SockServ[i] = INVALID_SOCKET;
>> >> >
>> >> > // Get a list of available addresses to serve on
>> >> >
>> >> > memset(&Hints, 0, sizeof(Hints));
>> >> > Hints.ai_family = nFamily;
>> >> > Hints.ai_socktype = nSockType;
>> >> > Hints.ai_flags = AI_NUMERICHOST | AI_PASSIVE;
>> >> > if(getaddrinfo(NULL, szPort, &Hints, &AddrInfo))
>> >> > {
>> >> > OutputDebugString(TEXT("ERROR: Couldn't get resolve the
>> >> > server
>> >> > name/address!"));
>> >> > }
>> >> > nNumSocksCount = 0;
>> >> > for(AI = AddrInfo; AI != NULL; AI = AI->ai_next)
>> >> > {
>> >> > if (nNumSocksCount == FD_SETSIZE)
>> >> > {
>> >> > // getaddrinfo returned more addresses than we could use
>> >> > break;
>> >> > }
>> >> >
>> >> > if((AI->ai_family == PF_INET) || (AI->ai_family == PF_INET6))
>> >> > //
>> >> > only want PF_INET or PF_INET6
>> >> > {
>> >> > SockServ[nNumSocksCount] = socket(AI->ai_family,
>> >> > AI->ai_socktype, AI->ai_protocol);
>> >> > if (SockServ[nNumSocksCount] != INVALID_SOCKET)
>> >> > {
>> >> > if (bind(SockServ[nNumSocksCount], AI->ai_addr,
>> >> > AI->ai_addrlen) == SOCKET_ERROR)
>> >> > closesocket(SockServ[nNumSocksCount]);
>> >> > else
>> >> > {
>> >> > OutputDebugString(
>> >> > TEXT("Socket 0x%08x ready for connection with
>> >> > %hs
>> >> > family, %hs type, on port %hs\r\n"),
>> >> > SockServ[nNumSocksCount],
>> >> > (AI->ai_family == AF_INET) ? "AF_INET" :
>> >> > ((AI->ai_family == AF_INET6) ? "AF_INET6" : "UNKNOWN"),
>> >> > (AI->ai_socktype == SOCK_STREAM) ? "TCP" :
>> >> > ((AI->ai_socktype == SOCK_DGRAM) ? "UDP" : "UNKNOWN"),
>> >> > szPort);
>> >> > nNumSocksCount++;
>> >> > }
>> >> > }
>> >> > }
>> >> > }
>> >> >
>> >> > freeaddrinfo(AddrInfo);
>> >> >
>> >> > if (nNumSocksCount == 0)
>> >> > {
>> >> > OutputDebugString(TEXT("ERROR: Unable to serve on any
>> >> > address.
>> >> > Error
>> >> > = %d\r\n"), WSAGetLastError());
>> >> > goto Cleanup;
>> >> > }
>> >> > //Initializing socket s for transmission
>> >> > s = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
>> >> > memset(&addr,0,sizeof(struct sockaddr_in));
>> >> > addr.sin_family = PF_INET;
>> >> > addr.sin_addr.s_addr = inet_addr(IP_SERVER);//Server IP
>> >> > addr.sin_port = htons((short )atoi(PORT_SERVER));//(5 0 7 0); Server
>> >> > Listen
>> >> > Port
>> >> > //1st Transmission ( REGISTER )
>> >> > i=sendto(s,reg_dest,strlen(reg_dest),0,(struct sockaddr
>> >> > *)&addr,sizeof(struct sockaddr_in));
>> >> > NKDbgPrintfW(L"\nSent : %d bytes\n\n",i);
>> >> > if(i != strlen(reg_dest))
>> >> > {
>> >> > OutputDebugString(TEXT("ERROR: Couldn't send the data! error
>> >> > =
>> >> > %d\r\n"), WSAGetLastError());
>> >> > }
>> >> > // Wait for incomming data/connections
>> >> > nNumSocks = nNumSocksCount;
>> >> > FD_ZERO(&fdSockSet);
>> >> > for (i = 0; i < nNumSocks; i++) // want to check all available
>> >> > sockets
>> >> > FD_SET(SockServ[i], &fdSockSet);
>> >> > if (select(nNumSocks, &fdSockSet, 0, 0, NULL) == SOCKET_ERROR)
>> >> > {
>> >> > OutputDebugString(TEXT("ERROR: select() failed with error =
>> >> > %d\r\n"), WSAGetLastError());
>> >> > goto Cleanup;
>> >> > }
>> >> > for (i = 0; i < nNumSocks; i++) // check which socket is ready to
>> >> > process
>> >> > {
>> >> > if (FD_ISSET(SockServ[i], &fdSockSet)) // proceed for
>> >> > connected
>> >> > socket
>> >> > {
>> >> > FD_CLR(SockServ[i], &fdSockSet);
>> >> > if(nSockType == SOCK_STREAM)
>> >> > {
>> >> > cbRemoteAddrSize = sizeof(ssRemoteAddr);
>> >> > sock = accept(SockServ[i], (SOCKADDR*)&ssRemoteAddr,
>> >> > &cbRemoteAddrSize);
>> >> > if(sock == INVALID_SOCKET)
>> >> > {
>> >> > OutputDebugString(TEXT("ERROR: accept() failed
>> >> > with
>> >> > error = %d\r\n"), WSAGetLastError());
>> >> > goto Cleanup;
>> >> > }
>> >> > OutputDebugString(TEXT("Accepted TCP connection from
>> >> > socket
>> >> > 0x%08x\r\n"), sock);
>> >> > }
>> >> > else
>> >> > {
>> >> > sock = SockServ[i];
>> >> > OutputDebugString(TEXT("UDP data available on socket
>> >> > 0x%08x\r\n"), sock);
>> >> > }
>> >> > break; // Only need one socket
>> >> > }
>> >> > }
>> >> > // Receive data from a client
>> >> >
>> >> > cbTotalRecvd = 0;
>> >> > do
>> >> > {
>> >> > cbRemoteAddrSize = sizeof(ssRemoteAddr);
>> >> > cbXfer = recvfrom(sock, packetbuffer + cbTotalRecvd,
>> >> > sizeof(packetbuffer) - cbTotalRecvd, 0,
>> >> > (SOCKADDR *)&ssRemoteAddr, &cbRemoteAddrSize);
>> >> > cbTotalRecvd += cbXfer;
>> >> > } while(cbXfer > 0 && cbTotalRecvd < sizeof(packetbuffer));
>> >> >
>> >> > OutputDebugString(TEXT("SUCCESS - Received %d bytes from client
>> >> > %hs\r\n"), cbTotalRecvd, szRemoteAddrString);
>> >> > Cleanup:
>> >> > for(i = 0; i < nNumSocks && SockServ[i] != INVALID_SOCKET; i++)
>> >> > closesocket(SockServ[i]);
>> >> > if(sock != INVALID_SOCKET)
>> >> > {
>> >> > shutdown(sock, SD_BOTH);
.
- References:
- call is blocked in recvfrom() and no further proceedings in Win CE
- From: Sudha.v
- Re: call is blocked in recvfrom() and no further proceedings in Win CE
- From: Paul G. Tobey [eMVP]
- Re: call is blocked in recvfrom() and no further proceedings in Wi
- From: Sudha.v
- Re: call is blocked in recvfrom() and no further proceedings in Wi
- From: Paul G. Tobey [eMVP]
- Re: call is blocked in recvfrom() and no further proceedings in Wi
- From: Sudha.v
- call is blocked in recvfrom() and no further proceedings in Win CE
- Prev by Date: Re: new to USB driver in wince
- Next by Date: Re: Windows CE 5.0 Architecture.
- Previous by thread: Re: call is blocked in recvfrom() and no further proceedings in Wi
- Next by thread: RE: call is blocked in recvfrom() and no further proceedings in Win CE
- Index(es):
Relevant Pages
|