📄 echoserver.c
字号:
//------------------------------------------------------------------------------
// EchoServer.c
//------------------------------------------------------------------------------
// Copyright 2006 Silicon Laboratories, Inc.
//
// Description:
// This file contains the routines which implement the TCP Echo Server.
//
#include "mn_userconst.h" // TCP/IP Library Constants
#include "mn_stackconst.h" // TCP/IP Library Constants
#include "mn_errs.h" // Library Error Codes
#include "mn_defs.h" // Library Type definitions
#include "mn_funcs.h" // Library Function Prototyes
#include "EchoServer.h" // Echo Server Header File
//------------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------------
int EchoServer_socketno = -1; // Holds the the Echo Server socket
// number. This number is assigned
// by the mn_open() routine.
unsigned char EchoServer_socketstate = DISCONNECTED;
// Holds the Echo Server socket state.
// This can be IDLE, CONNECTED, or
// DISCONNECTED.
// Echo Server Transmit Buffer.
unsigned char EchoServer_TX_BUFF[EchoServer_TX_BUFF_SIZE];
// Echo Server Receive Buffer.
unsigned char EchoServer_RX_BUFF[EchoServer_RX_BUFF_SIZE];
unsigned int EchoServer_send_length; // The size of the data in the transmit
// buffer.
bit EchoServer_send_now = 0; // Flag to indicate that the transmit
// buffer has been filled and is ready
// to be sent.
//------------------------------------------------------------------------------
// Function Prototypes
//------------------------------------------------------------------------------
void EchoServer_start(void);
void EchoServer_process_packet(void);
void EchoServer_server_idle(void);
void EchoServer_socket_closed(void);
//------------------------------------------------------------------------------
// EchoServer_start
//------------------------------------------------------------------------------
//
// This routine starts the EchoServer by opening a TCP socket and placing it
// in the IDLE state.
//
void EchoServer_start(void)
{
int status;
// Open a new TCP socket.
status = mn_open( null_addr, // Destination IP -- allow any IP
// address to connect
ECHOSERVER_PORT, // Source Port -- specify the local
// port number
0, // Destination Port -- allow any
// remote port to connect
NO_OPEN, // Do not wait for connection to
// be established (i.e. non-blocking)
PROTO_TCP, // TCP Socket
STD_TYPE, // Reqired constant
EchoServer_RX_BUFF, // Address of receive buffer
EchoServer_RX_BUFF_SIZE // Receive buffer size
);
// Check the value returned from mn_open()
// Possible Return Codes:
// 0 - 126: A valid socket number.
// NOT_SUPPORTED: Unsupported Protocol
// NOT_ENOUGH_SOCKETS: Too many open sockets
if(status < 0){
// Set the socket state to DISCONNECTED
EchoServer_socketstate = DISCONNECTED;
} else {
// Assign the return value of mn_open (a valid socket number) to the
// current socket number and set the socket state to IDLE
EchoServer_socketno = status;
EchoServer_socketstate = IDLE;
}
}
//------------------------------------------------------------------------------
// EchoServer_process_packet
//------------------------------------------------------------------------------
//
// This routine processes a packet after it has been received.
//
//
void EchoServer_process_packet()
{
int i;
PSOCKET_INFO socket_ptr;
// Obtain socket pointer
socket_ptr = MK_SOCKET_PTR(EchoServer_socketno);
//----------------------------------------------
// Handle incoming packet based on socket state
//----------------------------------------------
// IDLE State: This indicates that a connection has been established
if(EchoServer_socketstate == IDLE)
{
// Change socket state to CONNECTED
EchoServer_socketstate = CONNECTED;
} else
// CONNECTED State: This indicates a data packet has been received
if(EchoServer_socketstate == CONNECTED)
{
// Fill the transmit buffer
// Copy received data from receive buffer to transmit buffer
for(i = 0; i < socket_ptr->recv_len; i++)
{
EchoServer_TX_BUFF[i] = EchoServer_RX_BUFF[i];
}
// Indicate that the transmit buffer is ready to be sent
EchoServer_send_length = socket_ptr->recv_len;
EchoServer_send_now = 1;
}
}
//------------------------------------------------------------------------------
// EchoServer_server_idle
//------------------------------------------------------------------------------
//
// This routine is called when the TCP/IP Library is idle.
//
//
//
void EchoServer_server_idle(void)
{
int status;
//---------------------------------
// Task #1
// Send Packet (if neccessary)
//----------------------------------
// Check if a packet should be sent.
if((EchoServer_socketstate == CONNECTED) && EchoServer_send_now)
{
// Clear the EchoServer_send_now flag to prevent the same packet
// from bieng transmitted twice
EchoServer_send_now = 0;
// Send a packet
status = mn_send( EchoServer_socketno, // Socket Number (handle)
EchoServer_TX_BUFF, // Pointer to Transmit Buffer
EchoServer_send_length // Number of bytes to send
);
} else
//---------------------------------
// Task #2
// Check is socket needs to be opened
//----------------------------------
if(EchoServer_socketstate == DISCONNECTED)
{
// Start or Re-Start the server
EchoServer_start();
}
}
//------------------------------------------------------------------------------
// EchoServer_socket_closed
//------------------------------------------------------------------------------
//
// This routine is called when the TCP socket is closed
//
//
//
void EchoServer_socket_closed(void)
{
// Update the socket state variable
EchoServer_socketstate = DISCONNECTED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -