在线时间22 小时
UID413183
注册时间2013-1-17
NXP金币0
该用户从未签到
注册会员

- 积分
- 169
- 最后登录
- 2019-6-28
|

楼主 |
发表于 2016-5-27 09:11:56
|
显示全部楼层
芯片K60 MQX版本4.2 - void rtcs_init(void)
- {
- uint32_t error;
- _enet_address enet_addr = ENET_MAC;
-
- //初始化RTCS的一些全局变量,按需求设置减少内存使用
- _RTCSPCB_init = 4; //表示数据包控制块 , 指的是你希望RTCS协议栈能够处理的包的数量
- _RTCSPCB_grow = 2;
- _RTCSPCB_max = 20;
- _RTCS_msgpool_init = 2; //表示RTCS消息池, 它用来封装对RTCS协议栈的应用请求,该值指的是应用程式同时能发多少个请求给RTCS协议栈
- _RTCS_msgpool_grow = 1;
- _RTCS_msgpool_max = 4;
- _RTCS_socket_part_init = 2; //应用中创建的所有的socket的数量
- _RTCS_socket_part_grow = 1;
- _RTCS_socket_part_max = 8;
-
- error = RTCS_create(); //RTCS创建
- if (error == RTCS_OK) { printf("\nRTCS创建成功\n"); }
- else{ printf("\nRTCS创建失败\n");}
-
- error = ipcfg_init_device(BSP_DEFAULT_ENET_DEVICE, enet_addr); //网络设备初始化
- if (error == IPCFG_OK) { printf("\n网络设备初始化成功\n"); }
- else{ printf("\n网络设备初始化失败\n");}
- // _lwsem_create (&lock, 1);
- }
- /*函数---------------------------------------------------------------
- *
- * 函数名称: enet_set
- * 功能概要:以太网参数设置
- * 参数说明:
- * 函数返回:无
- * 备注:
- *END*--------------------------------------------------------------*/
- void enet_set(void)
- {
- uint32_t temp;
- uint32_t server_sock; //用于服务器待连接刘套接字
- IPCFG_IP_ADDRESS_DATA ip_data;
- sockaddr local_sockin; //本端套接字参数
-
- //变更参数
- ip_data.ip = local_ipaddr;
- ip_data.mask = local_ipmask;
- ip_data.gateway = local_ipgateway;
-
- //静态IP绑定
- temp =ipcfg_bind_staticip (BSP_DEFAULT_ENET_DEVICE, &ip_data);
- if (temp == IPCFG_OK) { printf("\n静态IP绑定成功\n"); }
- else{ printf("\n静态IP绑定失败\n");}
-
- //创建套接字 参数:协议 流套接字(有链接,以字节为单位传输)/保温套接字(无连接,以数据块为单位传输)
- server_sock = socket(AF_INET, SOCK_STREAM, 0);
- if (server_sock == RTCS_SOCKET_ERROR) { printf("\n套接字创建错误 \n"); }
- else { printf("\nTCP套接字创建成功 \n"); }
-
- //设置发送接收缓冲大小,设置超时时间
- temp = SOCKET_SEND_BUFFER_SIZE;
- (void) setsockopt(server_sock, SOL_TCP, OPT_TBSIZE, &temp, sizeof(temp));
- temp = SOCKET_RECEIVE_BUFFER_SIZE;
- (void) setsockopt(server_sock, SOL_TCP, OPT_RBSIZE, &temp, sizeof(temp));
- temp = RTCSCFG_TELNETSRV_TIMEWAIT_TIMEOUT;
- setsockopt(server_sock, SOL_TCP, OPT_TIMEWAIT_TIMEOUT, &temp, sizeof(temp));
-
- //调用bind()函数将套接字与本地地址绑定(服务器绑定)
- local_sockin.sin_family = AF_INET;
- local_sockin.sin_port = local_port;
- local_sockin.sin_addr.s_addr = INADDR_ANY;
- temp = bind(server_sock, &local_sockin, sizeof(local_sockin));
- if (temp != RTCS_OK) { printf("\n绑定套接字失败\n"); }
- else
- {
- printf("\n绑定套接字成功\n");
- //套接字设置监听
- temp = listen(server_sock, 0);
- if (temp != RTCS_OK) { printf("Error 0x%X: Unable to put IPv4 socket in listening state.\n", temp); }
- }
- printf("监听参数: IPv4 Address: %d.%d.%d.%d, port:%d\n", IPBYTES(local_ipaddr), local_port);
- printf("\nWaiting for incoming connection...");
-
- dmu_tid.server_socket_tid = _task_create(0, SERVER_SOCKET_TASK, server_sock);
- // enet_rx_num=0;
- }
- /*任务---------------------------------------------------------------
- *
- * 任务名称: server_socket_task
- * 功能概要:等待服务器流连接套接字的建立,建立后创建接收任务enet_rx_task()
- * 备注:
- *END*--------------------------------------------------------------*/
- void server_socket_task(uint32_t parameter)
- {
- uint32_t option;
- while (1)
- {
- // if(enet_rx_num>2)
- // {
- // shutdown(iodhsocks[0], FLAG_CLOSE_TX); //断开套接字
- // _task_destroy(dmu_tid.enet_rx_tid[0]);
- // shutdown(iodhsocks[1], FLAG_CLOSE_TX); //断开套接字
- // _task_destroy(dmu_tid.enet_rx_tid[1]);
- // enet_rx_num=0;
- // }
- //等待新的套接字流来从远程端点接收传入的连接
- iodh_sock= accept(parameter, NULL, NULL);
- // iodhsocks[enet_rx_num]=iodh_sock;
- if (iodh_sock == RTCS_SOCKET_ERROR)
- {
- uint32_t status;
- status = RTCS_geterror(iodh_sock);
- printf("Fatal Error: Unable to accept incoming connection. ");
- if (status == RTCS_OK){printf("Connection reset by peer.");}
- else { printf("Accept() failed with error code 0x%X.\n", status); }
- }
- // //设置接收不等待(非阻塞I/O), TCP的PUSH 接收压栈(延迟传输)
- // option = TRUE;
- // retval = setsockopt(client_sock, SOL_TCP, OPT_RECEIVE_NOWAIT, &option, sizeof(option)); //FALSE(默认值)
- // retval = setsockopt(client_sock, SOL_TCP, OPT_RECEIVE_PUSH, &option, sizeof(option)); //TRUE(默认值)
- // if (retval != RTCS_OK){ printf("Fatal Error: Unable to set socket options."); }
- option = TRUE;
- setsockopt(client_sock, SOL_TCP, OPT_SEND_NOWAIT, &option, sizeof(option)); //TRUE(默认值)
- option = FALSE;
- setsockopt(client_sock, SOL_TCP, OPT_SEND_PUSH, &option, sizeof(option)); //TRUE(默认值)
- printf("\naccept starting 0x%lx\n",iodh_sock);
- // dmu_tid.enet_rx_tid[enet_rx_num] = _task_create(0, ENET_RX_TASK, iodh_sock);
- // if (dmu_tid.enet_rx_tid[enet_rx_num] == MQX_NULL_TASK_ID)
- // {
- // fprintf(stderr, "Fatal Error 0x%X: Unable to create receive task.", _task_get_error());
- // }
- // enet_rx_num++;
- dmu_tid.enet_rx_tid = _task_create(0, ENET_RX_TASK, iodh_sock);
- if (dmu_tid.enet_rx_tid == MQX_NULL_TASK_ID)
- {
- fprintf(stderr, "Fatal Error 0x%X: Unable to create receive task.", _task_get_error());
- }
-
- _time_delay(1);
- }
- }
- /*任务---------------------------------------------------------------
- *
- * 任务名称: enet_rx_task
- * 功能概要:服务器流套接字产生,接收以太网数据;
- * 当接收数据错误时,断开套接字,销毁任务释放内存
- * 参数说明:parameter:任务参数的结构体指针,主要:连接的套接字句柄
- *
- *END*--------------------------------------------------------------*/
- void enet_rx_task(uint32_t parameter)
- {
- uint8_t RecvBuf[1050];
- uint32_t count = 0;
-
- while(1)
- {
- count = recv(parameter, (void *)RecvBuf, sizeof(RecvBuf), 0);
- if (count == RTCS_ERROR)
- {
- printf("\nError, recv() failed with error code %lx", RTCS_geterror(parameter)); //1636:连接对端重置 1638:连接断开
- shutdown(parameter, FLAG_CLOSE_TX); //连接错误,断开套接字
- _task_destroy(_task_get_id());
- // enet_rx_num--;
- }
- else
- {
- i3r_package(RecvBuf,count);
- // printf("%s\n%d\n",RecvBuf,count);
- }
- _time_delay(1);
- }
- }
复制代码 |
|