⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echoserver.c

📁 一个TCP的例子
💻 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 + -