中级会员
- 积分
- 377
- 金钱
- 377
- 注册时间
- 2015-10-19
- 在线时间
- 173 小时
|
发表于 2019-1-3 09:46:24
|
显示全部楼层
應該更改下代碼, 我的TCP Serve發送速度約為655KB/Sec
// SEND_BUF_SIZE=1024 发送数据长度 1024Bytes 約為 655KB/Sec
// LWIP数据发送,用户应用程序调用此函数来发送数据
// tpcb:TCP控制块
// 返回值:0,成功;其他,失败
// err_t tcp_server_usersent(struct tcp_pcb *tpcb, u16 sendLength)
err_t tcp_server_usersent(struct tcp_pcb *tpcb, struct my_lwip_file *myStruct)
{
err_t ret_err;
struct tcp_server_struct *es;
struct pbuf *ptr;
err_t wr_err=ERR_OK;
u16 plen;
static u8 readFileFlag=0; // David 添加的讀取SD卡檔案識別旗號, 0 --> Open File, 1 --> Read File
static u8 readData=1; // David 添加的讀取jpg 數據旗號, 0 --> 不執行 Read File 以避免因數據尚未傳送再次讀檔造成數據丟失
es=tpcb->callback_arg;
if(es!=NULL){ // 连接处于空闲可以发送数据
if(readData){ // David 添加的前次數據有成功傳送可繼續讀取
if(readFileFlag){
readFile(myStruct);
}else{
openFile(myStruct); // 開啟檔案
readFileFlag=1;
}
}
readData=0; // 預設為不讀取數據
es->p=pbuf_alloc(PBUF_TRANSPORT, myStruct->sendLength,PBUF_POOL); // 申请内存
pbuf_take(es->p,(char*)myStruct->sendBuffer,myStruct->sendLength); // 将tcp_server_sentbuf[]中的数据拷贝到es->p_tx中
while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tpcb->snd_buf)){
ptr=es->p;
wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1); // 将要发送的数据加入发送缓冲队列中
if(wr_err){
return 1;
}
if(wr_err==ERR_OK){
plen=ptr->len;
es->p=ptr->next; // 指向下一个pbuf
if(es->p){pbuf_ref(es->p);} // pbuf的ref加一
pbuf_free(ptr);
tcp_recved(tpcb,plen); // 更新tcp窗口大小
}else if(wr_err==ERR_MEM){
es->p=ptr;
}
tcp_nagle_disable(tpcb); // David 添加的屏蔽nagle算法才會立即發送 Data, tpcb->flags |= TF_NODELAY
ret_err=tcp_output(tpcb); // 将发送缓冲队列中的数据发送出去
readData= !ret_err ? 1 : 0; // 當正確傳送數據後再設定為 TRUE
}
if(es->p!=NULL){
pbuf_free(es->p); // 释放内存
}
ret_err=ERR_OK;
}else{
tcp_abort(tpcb); // 终止连接,删除pcb控制块
ret_err=ERR_ABRT;
}
return ret_err;
}
|
|