send jpeg thru udp

wk's icon

hi,

i need to send jpeg images to the device,
it works using code pasted below, but it is win specific
(and outside max),
im wondering if its possible using java or tweaking jit.broadcast
(although i couldn`t get it to work).

btw: how i can adapt it for terminal use in os x?
i`ll be grateful if someone can have a look,

thanks,
wojciech

// PSP UDP Send
// primarily for sending image data
// limited to 30KB

#include
#include // Sleep
#pragma comment(lib, "wsock32.lib")

#define MAX_DATA_SIZE 30000

// keep UDP file size small to avoid problems

//////////////////////////////////////////////////////////// /

WSADATA g_wsaData;

byte g_image[MAX_DATA_SIZE];
int g_cbImage = 0;

//////////////////////////////////////////////////////////// /

bool ParseIPAddrString(byte ipAddr[4], const char* szIPAddr)
{
int b1, b2, b3, b4;
if (sscanf(szIPAddr, "%d.%d.%d.%d", &b1, &b2, &b3, &b4) != 4)
return false;
ipAddr[0] = b1;
ipAddr[1] = b2;
ipAddr[2] = b3;
ipAddr[3] = b4;
return true;
}

int main(int argc, char* argv[])
{
if (argc != 4)
{
     printf("usage: udpsend psp_ip_address port data_filen");
return -1;
}
const char* szIPForward = argv[1];
int port = atoi(argv[2]);
const char* szDataFile = argv[3];

    byte ipaddrDest[4];
if (!ParseIPAddrString(ipaddrDest, szIPForward))
{
printf("udpsend: Bad IP addressn");
return -1;
}

// load file
FILE* pf = fopen(szDataFile, "rb");
if (pf == NULL)
{
printf("udpsend: missing data filen");
return -1;
}
fseek(pf, 0, SEEK_END);
g_cbImage = ftell(pf);
fseek(pf, 0, SEEK_SET);
if (g_cbImage
{
printf("udpsend: data file too smalln");
fclose(pf);
return -1;
}
if (g_cbImage > MAX_DATA_SIZE)
{
printf("udpsend: data file too big (limited to %d)n",
MAX_DATA_SIZE);
fclose(pf);
return -1;
}
if (fread(g_image, g_cbImage, 1, pf) != 1)
{
printf("udpsend: data read errorn");
fclose(pf);
return -1;
}
fclose(pf);

// WiFi send

if (WSAStartup(MAKEWORD(1,1), &g_wsaData) != 0) // windows specific
{
printf("udpsend: winsock init errorn");
return -1;
}

// general socket stuff
// send data as on big UDP send to a specific IP address

    SOCKET hSock = socket(AF_INET, SOCK_DGRAM, 0);
if (hSock == INVALID_SOCKET)
{
printf("udpsend: socket create errorn");
goto cleanup;
}

    SOCKADDR_IN sinDest;
    sinDest.sin_family = AF_INET;
    sinDest.sin_port = htons(port);
sinDest.sin_addr.S_un.S_un_b.s_b1 = ipaddrDest[0];
sinDest.sin_addr.S_un.S_un_b.s_b2 = ipaddrDest[1];
sinDest.sin_addr.S_un.S_un_b.s_b3 = ipaddrDest[2];
sinDest.sin_addr.S_un.S_un_b.s_b4 = ipaddrDest[3];

    if (sendto(hSock, (char*)g_image, g_cbImage, 0,
     (struct sockaddr*)&sinDest, sizeof(sinDest)) != g_cbImage)
{
printf("udpsend: sendto errorn");
}

// that's all folks...

cleanup:
    WSACleanup(); // windows specific

return 0;
}

Wesley Smith's icon

Hi Wojciech,
What is receiveing your JPEGs? This is kind of funny 'cause I'm
rewriting a jpeg/png uploaded in java at this very moment. I used to
have code that did it, but I lost it when my hard drive crashed.

So, the way I did it before was to use ssh through the terminal using
key-authentication. With ssh you can call commands on the remote
server. I was calling a PHP script that took a jpeg stream and some
meta data. This script then posted the jpeg to a webpage. It worked
really well.

In java, you can't pipe processes like you can when typing in the
terminal, so I would call:

cat jpegfilename.jpg

from java using the terminal interface and grab the stdout and in java
code "pipe" the stdout into the stdin of:

ssh login@server phpscript

Hope this helps.
best,
wes