Hi Redbeard,
Funny, I have a similar requirement. First, take a look at this sockets tutorial....
http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html (
http://www.cs.rpi.edu/courses/sysprog/sockets/sock.html)
The simplest approach is to implement a socket client on NIOS. So here's a trivial socket client (modelled on the tutorial). BTW, this code runs nicely on NIOS (under uClinux, with network support and LAN91C111 driver enabled).....
// tty2sock.cpp
// ============# include <stdio.h># include <stdlib.h># include <string.h># include <unistd.h># include <sys/types.h># include <sys/socket.h># include <netinet/in.h># include <netdb.h>
# define SERVER_NAME "192.168.0.78" // Your server IP goes here# define SERVER_PORT 4000
void error(char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv)
{
struct sockaddr_in serv_addr;
char buffer = { 0 };
printf ("Hello from tty2sock!\n");
FILE* ttyPort = fopen ("/dev/tty", "r");
int portNumber = SERVER_PORT;
printf ("portNumber=0x%8x\n", portNumber);
int sockHandle = socket(AF_INET, SOCK_STREAM, 0);
printf ("sockHandle=0x%8x\n", sockHandle);
if (sockHandle < 0)
{
error ("ERROR opening socket");
}
struct hostent* server = gethostbyname(SERVER_NAME);
if (server == NULL)
{
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
memset (&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy ((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(SERVER_PORT);
if (connect(sockHandle,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
{
error ("ERROR connecting");
}
printf ("Enter a message: ");
bzero (buffer, 256);
fgets (buffer, 255, stdin);
printf ("buffer=\n", buffer);
int n = write(sockHandle,buffer,strlen(buffer));
if (n < 0)
{
error ("ERROR writing to socket");
}
return 0;
}
Next, here's the corresponding socket server (also modelled on the tutorial). BTW, this server is running on a Debian Linux box...
// socketServer.cpp
// ================
// A simple server in the internet domain using TCP
// The port number is passed as an argument # include <stdio.h># include <stdlib.h># include <string.h># include <netinet/in.h># include <sys/types.h> # include <sys/socket.h># include <unistd.h>
void error(char *msg)
{
perror (msg);
exit (1);
}
int main (int argc, char *argv)
{
int sockfd, newsockfd, portno;
socklen_t clilen = 0;
char buffer;
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2)
{
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
error("ERROR opening socket");
}
//bzero((char *) &serv_addr, sizeof(serv_addr));
memset (&serv_addr,
0,
sizeof(serv_addr));
portno = atoi(argv);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
error("ERROR on binding");
}
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *)&cli_addr,
(socklen_t*)&clilen);
if (newsockfd < 0)
{
error("ERROR on accept");
}
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0)
{
error("ERROR reading from socket");
}
printf("Here is the message: %s\n",buffer);
return 0;
}
How to run it...
1) Compile the socketServer app on your PC. I'm using Eclipse on Debian.
2) Cross-compile and link the tty2sock app as follows....
nios2-linux-uclibc-c++ tty2sock.cpp -o tty2sock -elf2flt="-s 64000"
cp tty2sock ~/rootfs/bin
3) Startup the server on PC, supplying PORT on the command-line...eg. "socketServer 4000"
4) Execute tty2sock on NIOS
nios-terminal -->
tty2sock -->
"The quick brown fox jumps over the lazy dog"
5) Your message should gurgle out on the server.
Hope this helps