使用举例:
/*
*********************************************************************************************************
* 宏定义,远程服务器的IP和端口
*********************************************************************************************************
*/
/* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
#define IP1 192
#define IP2 168
#define IP3 1
#define IP4 2
#define PORT_NUM 1001
/* 这个是本地端口 */
#define LocalPort_NUM 1024
/*
*********************************************************************************************************
* 变量
*********************************************************************************************************
*/
uint8_t socket_tcp;
uint8_t Rem_IP[4] = {IP1,IP2,IP3,IP4};
/*
*********************************************************************************************************
* 函 数 名: tcp_callback
* 功能说明: TCP Socket的回调函数
* 形 参: soc TCP Socket类型
* evt 事件类型
* ptr 事件类型是TCP_EVT_DATA,ptr指向的缓冲区记录着接收到的TCP数据,其余事件记录IP地址
* par 事件类型是TCP_EVT_DATA,记录接收到的数据个数,其余事件记录端口号
* 返 回 值:
*********************************************************************************************************
*/
U16 tcp_callback (U8 soc, U8 evt, U8 *ptr, U16 par)
{
char buf[50];
uint16_t i;
/* 确保是socket_tcp的回调 */
if (soc != socket_tcp)
{
return (0);
}
switch (evt)
{
/*
远程客户端连接消息
1、数组ptr存储远程设备的IP地址,par中存储端口号。
2、返回数值1允许连接,返回数值0禁止连接。
*/
case TCP_EVT_CONREQ:
sprintf(buf, "远程客户端请求连接IP: %d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
printf_debug("IP:%s port:%drn", buf, par);
return (1);
/* 连接终止 */
case TCP_EVT_ABORT:
break;
/* Socket远程连接已经建立 */
case TCP_EVT_CONNECT:
printf_debug("Socket is connected to remote peerrn");
break;
/* 连接断开 */
case TCP_EVT_CLOSE:
printf_debug("Connection has been closedrn");
break;
/* 发送的数据收到远程设备应答 */
case TCP_EVT_ACK:
break;
/* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
case TCP_EVT_DATA:
printf_debug("Data length = %drn", par);
for(i = 0; i < par; i++)
{
printf_debug("ptr[%d] = %drn", i, ptr[i]);
}
break;
}
return (0);
}
/*
*********************************************************************************************************
* 函 数 名: TCPnetTest
* 功能说明: TCPnet应用
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void TCPnetTest(void)
{
int32_t iCount;
uint8_t *sendbuf;
uint8_t tcp_status;
uint16_t maxlen;
uint8_t res;
OS_RESULT xResult;
const uint16_t usMaxBlockTime = 2;·
/*
创建TCP Socket并连接,客户端连接服务器后,10秒内无数据通信将断开连接。
但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
*/
socket_tcp = tcp_get_socket (TCP_TYPE_CLIENT | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);
if(socket_tcp != 0)
{
res = tcp_connect (socket_tcp, Rem_IP, PORT_NUM, LocalPort_NUM);
printf("TCP Socket创建成功res = %drn", res);
}
while (1)
{
/* RL-TCPnet处理函数 */
main_TcpNet();
/* 用于网线插拔的处理 */
tcp_status = TCP_StatusCheck();
/* 按键消息的处理 */
if((os_evt_wait_or(0xFFFF, usMaxBlockTime) == OS_R_EVT)&&(tcp_status == __TRUE))
{
xResult = os_evt_get ();
switch (xResult)
{
/* 接收到K1键按下,给远程TCP服务器发送8字节数据 */
case KEY1_BIT0:
printf_debug("tcp_get_state(socket_tcp) = %drn", tcp_get_state(socket_tcp));
iCount = 8;
do
{
main_TcpNet();
if (tcp_check_send (socket_tcp) == __TRUE)
{
maxlen = tcp_max_dsize (socket_tcp);
iCount -= maxlen;
if(iCount < 0)
{
/* 这么计算没问题的 */
maxlen = iCount + maxlen;
}
sendbuf = tcp_get_buf(maxlen);
sendbuf[0] = '1';
sendbuf[1] = '2';
sendbuf[2] = '3';
sendbuf[3] = '4';
sendbuf[4] = '5';
sendbuf[5] = '6';
sendbuf[6] = '7';
sendbuf[7] = '8';
/* 测试发现只能使用获取的内存 */
tcp_send (socket_tcp, sendbuf, maxlen);
}
}while(iCount > 0);
break;
/* 其他的键值不处理 */
default:
break;
}
}
}
} |