add a workaround to avoid the using of the missing select function
This commit is contained in:
parent
bdb0a895f2
commit
62f2038a6e
1 changed files with 27 additions and 5 deletions
30
apps/netio.c
30
apps/netio.c
|
@ -30,6 +30,8 @@
|
||||||
#include <asm/SCC_API.h>
|
#include <asm/SCC_API.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define USE_SOCKET_BYPASSING 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This implements a netio server and client (only TCP version).
|
* This implements a netio server and client (only TCP version).
|
||||||
* The client sends a command word (4 bytes) then a data length word (4 bytes).
|
* The client sends a command word (4 bytes) then a data length word (4 bytes).
|
||||||
|
@ -45,8 +47,20 @@
|
||||||
/* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */
|
/* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */
|
||||||
|
|
||||||
#ifdef CONFIG_LWIP
|
#ifdef CONFIG_LWIP
|
||||||
|
#if USE_SOCKET_BYPASSING // for socket bypassing
|
||||||
|
#include <lwip/opt.h>
|
||||||
|
#undef LWIP_COMPAT_SOCKETS
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <lwip/sockets.h>
|
#include <lwip/sockets.h>
|
||||||
#include <lwip/err.h>
|
#include <lwip/err.h>
|
||||||
|
#include <lwip/stats.h>
|
||||||
|
|
||||||
|
#if USE_SOCKET_BYPASSING // for socket bypassing
|
||||||
|
#include <net/mmnif.h>
|
||||||
|
#undef AF_INET
|
||||||
|
#define AF_INET AF_MMNIF_NET
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -60,10 +74,10 @@ typedef struct
|
||||||
#define CMD_RES 3
|
#define CMD_RES 3
|
||||||
|
|
||||||
#define CTLSIZE sizeof(CONTROL)
|
#define CTLSIZE sizeof(CONTROL)
|
||||||
#define DEFAULTPORT 0x494F /* "IO" */
|
#define DEFAULTPORT 0x494F
|
||||||
#define TMAXSIZE 65536
|
#define TMAXSIZE 65536
|
||||||
|
|
||||||
static int tSizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767};
|
static int tSizes[] = {/*1, 2, 4, 8, 16, */32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767};
|
||||||
static size_t ntSizes = sizeof(tSizes) / sizeof(int);
|
static size_t ntSizes = sizeof(tSizes) / sizeof(int);
|
||||||
static int nPort = DEFAULTPORT;
|
static int nPort = DEFAULTPORT;
|
||||||
static const int sobufsize = 131072;
|
static const int sobufsize = 131072;
|
||||||
|
@ -153,6 +167,7 @@ static int TCPServer(void* arg)
|
||||||
setsockopt(server, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize));
|
setsockopt(server, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize));
|
||||||
setsockopt(server, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize));
|
setsockopt(server, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize));
|
||||||
|
|
||||||
|
memset((char *) &sa_server, 0x00, sizeof(sa_server));
|
||||||
sa_server.sin_family = AF_INET;
|
sa_server.sin_family = AF_INET;
|
||||||
sa_server.sin_port = htons(nPort);
|
sa_server.sin_port = htons(nPort);
|
||||||
sa_server.sin_addr = addr_local;
|
sa_server.sin_addr = addr_local;
|
||||||
|
@ -177,6 +192,7 @@ static int TCPServer(void* arg)
|
||||||
{
|
{
|
||||||
kprintf("TCP server listening.\n");
|
kprintf("TCP server listening.\n");
|
||||||
|
|
||||||
|
#ifdef select
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(server, &fds);
|
FD_SET(server, &fds);
|
||||||
tv.tv_sec = 3600;
|
tv.tv_sec = 3600;
|
||||||
|
@ -190,10 +206,16 @@ static int TCPServer(void* arg)
|
||||||
|
|
||||||
if (rc == 0 || FD_ISSET(server, &fds) == 0)
|
if (rc == 0 || FD_ISSET(server, &fds) == 0)
|
||||||
continue;
|
continue;
|
||||||
|
#endif
|
||||||
length = sizeof(sa_client);
|
length = sizeof(sa_client);
|
||||||
if ((client = accept(server, (struct sockaddr *) &sa_client, &length)) == -1)
|
#if USE_SOCKET_BYPASSING
|
||||||
|
// TODO: Bug, not compatible with BSD sockets
|
||||||
|
memcpy(&sa_client, &sa_server, length);
|
||||||
|
#endif
|
||||||
|
if ((client = accept(server, (struct sockaddr *) &sa_client, &length)) < 0) {
|
||||||
|
kprintf("accept faild: %d\n", errno);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
setsockopt(client, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize));
|
setsockopt(client, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize));
|
||||||
setsockopt(client, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize));
|
setsockopt(client, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize));
|
||||||
|
|
Loading…
Add table
Reference in a new issue