Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

私はネットワーキングにとても慣れていません。 xmc4700リラックスキットとラップトップの間で単純なTCP / IPネットワークを使用したいです。 しかし、TCP接続の戻り値として-4を取得しています。

 

/*
* main.c
*
* 作成日: 2023 Dec 11 12:09:17
*著者:320166058
*/
 
 
 
 
#include "DAVE.h" (デイブ・ドット・ホ)DAVE コード生成からの宣言 (SFR 宣言を含む)
#include
 
/**
 
* @brief main() - アプリケーション・エントリー・ポイント
*
* 機能の詳細
* このルーチンは、アプリケーションのエントリー・ポイントです。 これは、デバイスのスタートアップ コードによって呼び出されます。 それは責任があります
* APP初期化ディスパッチャールーチンの呼び出し - DAVE_Init()とユーザーアプリケーションのプレースホルダーのホスティング
*コード。
*/
 
/* プロトコルの状態 */
列挙型tcp_client_states
{
ES_NONE = 0 の場合
ES_CONNECTED、
ES_RECEIVING、
ES_CLOSING
};
 
/* 引数として渡される接続情報を保持するための構造体
LwIPコールバックへ*/
構造体tcp_client_struct
{
u8_t状態;            /* 現在の接続状態 */
u8_t再試行します。
構造体 tcp_pcb *PCB;   /* 現在のtcp_pcbへのポインタ */
構造体 pbuf *p;        /* 受信/送信予定の pbuf のポインタ */
};
 
 
 
/* このコールバックは、クライアントがサーバーに接続したときに呼び出されます */
static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err);
 
/* このコールバックは、クライアントがサーバーからデータを受信したときに呼び出されます */
static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
 
/* このコールバックは、サーバーがクライアントをポーリングするときに呼び出されます */
static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb);
 
/* このコールバックは、サーバーがクライアントから送信されたデータを確認するときに呼び出されます */
static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
 
/* サーバにデータを送信する関数 */
static void tcp_client_send(struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
/* 接続を閉じる関数 */
static void tcp_client_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
/* これは、サーバーからの受信データを処理する部分です */
static void tcp_client_handle (struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
 
int型カウンタ= 0;
uint8_tデータ[100];
 
 
 
/* データを格納する構造体を作成 */
構造体tcp_client_struct *esTx = 0;
 
構造体tcp_pcb *pcbTx = 0;
 
 
ボイドTcp_Packet_Send()
{
シャアbuf[100];
 
/* サーバーに送信する最初のメッセージを準備する */
int型len = sprintf(buf、 "TCPclientメッセージ%d\nを送信しています"、カウンタ);
 
if (カウンタ !=0)
{
/* PBUF の割り当て */
esTx->p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL);
 
 
/* データを PBUF にコピー */
pbuf_take(esTx->p, (char*)buf, len);
 
tcp_client_send(pcbTx、esTx);
 
pbuf_free(esTx->p);
}
 
}
 
 
 
 
 
/* TCP クライアントの実装
 
1. TCPブロックを作成します。
2. サーバーに接続する
3. コミュニケーションを始める
*/
 
ボイドtcp_client_init(ボイド)
{
/* 1.新しいTCPPCBを作成 */
構造体 tcp_pcb *tpcb;
err_tヴァル;
tpcb = tcp_new();
 
/* 2.サーバーへの接続 */
ip_addr_t destIPADDR;
IP_ADDR4(&destIPADDR, 192, 168, 0, 20);
Val = tcp_connect(tpcb, &destIPADDR, 7000, tcp_client_connected);
printf("\n %d\n",Val);
}
 
/** このコールバックは、クライアントがサーバーに接続されたときに呼び出されます
* ここでは、他のいくつかのコールバックを初期化します
* 最後に、クライアントハンドル関数を呼び出します
*/
静的err_t tcp_client_connected(void *arg, struct tcp_pcb *newpcb, err_t err)
{
err_t ret_err;
構造体 tcp_client_struct *es;
 
LWIP_UNUSED_ARG(引数);
LWIP_UNUSED_ARG(エラー);
 
/* TCP 接続情報を保持するために構造体 es を割り当てる */
es = (構造体 tcp_client_struct *)mem_malloc(sizeof(構造体 tcp_client_struct));
if (es != NULL)
{
es->state = ES_CONNECTED;
es->pcb = newpcb;
es->retries = 0;
es->p = NULLです。
 
/* 新しく割り当てた es 構造体を引数として newpcb に渡す */
tcp_arg(newpcb, es);
 
/* newpcb のコールバック関数tcp_recv lwip を初期化 */
tcp_recv(newpcb, tcp_client_recv);
 
/* newpcb のコールバック関数tcp_poll lwip を初期化 */
tcp_poll(newpcb, tcp_client_poll, 0);
 
 
/* LwIP tcp_sentコールバック関数の初期化 */
tcp_sent(newpcb, tcp_client_sent);
 
/* TCP データの処理 */
tcp_client_handle(newpcb, es);
 
ret_err = ERR_OK;
}
然も無くば
{
/* TCP接続を閉じる */
tcp_client_connection_close(newpcb, es);
/* メモリエラーを返す */
ret_err = ERR_MEM;
}
ret_errを返します。
}
 
 
/** このコールバックは、クライアントがサーバーからデータを受信したときに呼び出されます
※受信したデータが有効な場合、クライアントハンドル機能でデータを取り扱います
*/
静的err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
構造体 tcp_client_struct *es;
err_t ret_err;
 
LWIP_ASSERT("引数 != NULL",引数 != NULL);
 
es =(構造体tcp_client_struct*)引数;
 
/* サーバーから空の TCP フレームを受信した場合 => 接続を閉じる */
(p == NULL)の場合
{
/* リモートホストが接続を閉じました */
es->state = ES_CLOSING;
if(es->p == NULL)
{
/* 送信が完了したので、接続を閉じる */
tcp_client_connection_close(tpcb、es);
}
然も無くば
{
/* まだ終わっていません */
/* 受信したパケットの確認応答 */
tcp_sent(tpcb, tcp_client_sent);
 
/* 残りのデータを送信*/
tcp_client_send(tpcb、es);
}
ret_err = ERR_OK;
}
/* else : 空でないフレームがサーバから受信されたが、何らかの理由で err != ERR_OK */
else if(err != ERR_OK)
{
/* 無料受信 PBUF*/
(p != NULL)の場合
{
es->p = NULLです。
pbuf_free(p);
}
ret_err = err;
}
else if(es->state == ES_CONNECTED)
{
/* 受信 pbuf (チェーン) への参照を格納する */
es->p = p;
 
tcp_sentは、最初にすでに初期化されています。
/* LwIP tcp_sentコールバック関数の初期化 */
tcp_sent(tpcb, tcp_client_sent);
 
/* 受信したデータを確認する */
tcp_recved(tpcb、p->tot_len);
 
/* 受信したデータを処理する */
tcp_client_handle(tpcb, es);
 
pbuf_free(p);
 
ret_err = ERR_OK;
}
else if(es->state == ES_CLOSING)
{
/* 奇数ケース、リモート側が 2 回クローズ、データ (trash data) */
tcp_recved(tpcb、p->tot_len);
es->p = NULLです。
pbuf_free(p);
ret_err = ERR_OK;
}
然も無くば
{
/* 不明な es->state, trash データ */
tcp_recved(tpcb、p->tot_len);
es->p = NULLです。
pbuf_free(p);
ret_err = ERR_OK;
}
ret_errを返します。
}
 
 
static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
err_t ret_err;
構造体 tcp_client_struct *es;
 
es =(構造体tcp_client_struct*)引数;
if (es != NULL)
{
(es->p != NULL)の場合
{
tcp_sentは、最初にすでに初期化されています。
tcp_sent(tpcb, tcp_client_sent);
/* PBUF (チェーン) が残っているので、データを送信してみてください */
tcp_client_send(tpcb、es);
}
然も無くば
{
/* PBUF (チェーン) が残っていません */
if(es->状態==ES_CLOSING)
{
/* TCP接続を閉じる */
tcp_client_connection_close(tpcb、es);
}
}
ret_err = ERR_OK;
}
然も無くば
{
/* 何もすることがない */
tcp_abort(tpcb);
ret_err = ERR_ABRT;
}
ret_errを返します。
}
 
/** このコールバックは、クライアントから送信されたデータをサーバーが確認応答するときに呼び出されます
*送信するデータがこれ以上残っていない場合は、接続を閉じるだけです
*/
static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
構造体 tcp_client_struct *es;
 
LWIP_UNUSED_ARG(len);
 
es =(構造体tcp_client_struct*)引数;
es->retries = 0;
 
if(es->p != NULL)
{
tcp_sentは、最初にすでに初期化されています。
/* まだ pbufs が送られている */
tcp_sent(tpcb, tcp_client_sent);
 
 
tcp_client_send(tpcb、es);
}
然も無くば
{
/* 送信するデータがなくなり、クライアントが接続を閉じた場合*/
if(es->状態==ES_CLOSING)
tcp_client_connection_close(tpcb、es);
}
ERR_OKを返します。
}
 
 
/** サーバーにデータを送信する関数
*/
static void tcp_client_send(struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
構造体 pbuf *ptr;
err_t wr_err = ERR_OK;
 
while ((wr_err == ERR_OK) &&
(es->p != NULL) &&
(es->p->len <= tcp_sndbuf(tpcb)))
{
 
/* es 構造体から pbuf へのポインタを取得 */
ptr = es->p;
 
/* 送信用のデータをキューに入れる */
wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
 
if (wr_err == ERR_OK)
{
u16_t plen;
u8_t解放された。
 
plen = ptr->len;
 
/* チェーン内の次の PBUF (存在する場合) を続行する */
es->p = ptr->next;
 
if(es->p != NULL)
{
/* ES->p のインクリメント参照カウント */
pbuf_ref(es->p);
}
 
/* チェーンから最初の PBUF を切り刻む */
する
{
/* PBUF の解放に一生懸命努力する */
解放された = pbuf_free(ptr);
}
while(freed == 0);
/* より多くのデータを読み込めるようになりました */
tcp_recved(tpcb、plen);
}
else if(wr_err == ERR_MEM)
{
/* メモリが不足しているので、後で試してみてください / もっと頑張って、ポーリングを延期してください */
es->p = ptr;
}
然も無くば
{
/* その他の問題 ??*/
}
}
}
 
 
static void tcp_client_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
 
/* すべてのコールバックを削除 */
tcp_arg(tpcb, NULL);
tcp_sent(tpcb, NULL);
tcp_recv(tpcb, NULL);
tcp_err(tpcb, NULL);
tcp_poll(tpcb, NULL, 0);
 
/* es 構造体の削除 */
if (es != NULL)
{
mem_free(es);
}
 
/* TCP接続を閉じる */
tcp_close(tpcb);
}
 
/* 受信 TCP データの処理 */
 
static void tcp_client_handle (struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
/* リモート IP の取得 */
ip4_addr_t inIP = tpcb->remote_ip;
uint16_t inPort = tpcb->remote_port;
 
/* IP の抽出 */
char *remIP = ipaddr_ntoa(&inIP);
 
esTx->state = es->state;
esTx->pcb = es->pcb;
esTx->p = es->p;
 
esTx = es;
pcbTx = tpcb;
 
カウンター++;
 
}
 
 
int main(void)
{
DAVE_STATUS_tステータス;
 
ステータス = DAVE_Init();          /* DAVE アプリケーションの初期化 */
tcp_client_init();
if (ステータス != DAVE_STATUS_SUCCESS)
{
/* エラーハンドラコードのプレースホルダ。 以下の while ループは CAN ユーザー エラー ハンドラーに置き換えることができます。 */
XMC_DEBUG("DAVE APPs の初期化に失敗しました\n");
 
ながら(1U)
{
 
}
}
 
/* ユーザアプリケーションコードのプレースホルダ。 以下の while ループは CAN ユーザー アプリケーション コードに置き換えることができます。 */
ながら(1U)
{
sys_check_timeouts();
 
}
}

問題のデバッグを手伝ってください。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/td-p/657234

0 件の賞賛
12 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

ねえ@gauravbhirud

  • プロジェクトをzipファイルとして共有できますか? これにより、エンジニアは問題をより迅速に再現/デバッグできます。
  • OPCUASERVER_LWIP_XMC47コード例が参考になるかもしれません。 あなたはここでそれをチェックすることができます - https://www.infineon.com/cms/en/product/promopages/aim-mc/dave_downloads.html 
  • -4 エラー コードは ERR_RTE エラーに対応しており、ルーティングの問題が原因である可能性があります。サーバーとクライアントの両方の当事者でIPアドレスとポートを確認することをお勧めします。

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/657421

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはニキル、

 

zipファイルの添付ファイルを見つけてください。 IPとポートの設定を確認したところ、ラップトップのIPを169.180.0.20に初期化し、ボードのIPを169.180.0.19に初期化しました。
ボードにpingを実行できますが、データパケットを送受信できません。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/658047

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@gauravbhirud

プロトコル設定でTCPを有効にしているか確認してください。

sujatapatil_0-1702384527073.png

 

感謝

スジャータ

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/658198

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

アプリでTCPオプションを有効にしましたが、それでも同じエラーが発生します。

gauravbhirud_0-1702385662904.png

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/658211

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは
これは、以下の手順でデバッグできます。
1>TCPサーバーが実行されているPC /ラップトップでnetstat出力を実行し、セッションが確立されていることを確認します。
2>wiresharkを使用してパケットをキャプチャし、可能であれば分析のためにファイルを共有します。

これについて何か助けが必要な場合は教えてください。

感謝
スジャータ

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/658776

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはスジャータ、

1. netstatコマンドの実行時にIPアドレスが表示されません。

2. 分析のために wireshark ログを添付します。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/660489

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはsujata、

このスレッドの更新はありますか?

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/677999

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@gauravbhirud

それでも問題が解決しない場合は、デバッグセッションを計画できます。 来週の適当な時期を教えてください。 オプションを提案する際には、IST時間を考慮してください。

感謝

スジャータ

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/688171

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@gauravbhirud

それでも問題が解決しない場合は、デバッグセッションを計画できます。 来週の適当な時期を教えてください。 オプションを提案する際には、IST時間を考慮してください。

感謝

スジャータ

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/688173

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

@gauravbhirud書きました:

私はネットワーキングにとても慣れていません。 xmc4700リラックスキットとラップトップの間で単純なTCP / IPネットワークを使用したいです。 しかし、TCP接続の戻り値として-4を取得しています。

 

/*
* main.c
*
* 作成日: 2023 Dec 11 12:09:17
*著者:320166058
*/
 
 
 
 
#include "DAVE.h" (デイブ・ドット・ホ)DAVE コード生成からの宣言 (SFR 宣言を含む)
#include
 
/**
 
* @brief main() - アプリケーション・エントリー・ポイント
*
* 機能の詳細
* このルーチンは、アプリケーションのエントリー・ポイントです。 これは、デバイスのスタートアップ コードによって呼び出されます。 それは責任があります
* APP初期化ディスパッチャールーチンの呼び出し - DAVE_Init()とユーザーアプリケーションのプレースホルダーのホスティング
*コード。
*/
 
/* プロトコルの状態 */
列挙型tcp_client_states
{
ES_NONE = 0 の場合
ES_CONNECTED、
ES_RECEIVING、
ES_CLOSING
};
 
/* 引数として渡される接続情報を保持するための構造体
LwIPコールバックへ*/
構造体tcp_client_struct
{
u8_t状態;            /* 現在の接続状態 */
u8_t再試行します。
構造体 tcp_pcb *PCB;   /* 現在のtcp_pcbへのポインタ */
構造体 pbuf *p;        /* 受信/送信予定の pbuf のポインタ */
};
 
 
 
/* このコールバックは、クライアントがサーバーに接続したときに呼び出されます */
static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err);
/* このコールバックは、クライアントがサーバーからデータを受信したときに呼び出されます */
static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err);
 
/* このコールバックは、サーバーがクライアントをポーリングするときに呼び出されます */
static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb);
 
/* このコールバックは、サーバーがクライアントから送信されたデータを確認するときに呼び出されます */
static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len);
 
/* サーバにデータを送信する関数 */
static void tcp_client_send(struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
/* 接続を閉じる関数 */
static void tcp_client_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
/* これは、サーバーからの受信データを処理する部分です */
static void tcp_client_handle (struct tcp_pcb *tpcb, struct tcp_client_struct *es);
 
 
int型カウンタ= 0;
uint8_tデータ[100];
 
 
 
/* データを格納する構造体を作成 */
構造体tcp_client_struct *esTx = 0;
 
構造体tcp_pcb *pcbTx = 0;
 
 
ボイドTcp_Packet_Send()
{
シャアbuf[100];
 
/* サーバーに送信する最初のメッセージを準備する */
int型len = sprintf(buf、 "TCPclientメッセージ%d\nを送信しています"、カウンタ);
 
if (カウンタ !=0)
{
/* PBUF の割り当て */
esTx->p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL);
 
 
/* データを PBUF にコピー */
pbuf_take(esTx->p, (char*)buf, len);
 
tcp_client_send(pcbTx、esTx);
 
pbuf_free(esTx->p);
}
 
}
 
 
 
 
 
/* TCP クライアントの実装
 
1. TCPブロックを作成します。
2. サーバーに接続する
3. コミュニケーションを始める
*/
 
ボイドtcp_client_init(ボイド)
{
/* 1.新しいTCPPCBを作成 */
構造体 tcp_pcb *tpcb;
err_tヴァル;
tpcb = tcp_new();
 
/* 2.サーバーへの接続 */
ip_addr_t destIPADDR;
IP_ADDR4(&destIPADDR, 192, 168, 0, 20);
Val = tcp_connect(tpcb, &destIPADDR, 7000, tcp_client_connected);
printf("\n %d\n",Val);
}
 
/** このコールバックは、クライアントがサーバーに接続されたときに呼び出されます
* ここでは、他のいくつかのコールバックを初期化します
* 最後に、クライアントハンドル関数を呼び出します
*/
静的err_t tcp_client_connected(void *arg, struct tcp_pcb *newpcb, err_t err)
{
err_t ret_err;
構造体 tcp_client_struct *es;
 
LWIP_UNUSED_ARG(引数);
LWIP_UNUSED_ARG(エラー);
 
/* TCP 接続情報を保持するために構造体 es を割り当てる */
es = (構造体 tcp_client_struct *)mem_malloc(sizeof(構造体 tcp_client_struct));
if (es != NULL)
{
es->state = ES_CONNECTED;
es->pcb = newpcb;
es->retries = 0;
es->p = NULLです。
 
/* 新しく割り当てた es 構造体を引数として newpcb に渡す */
tcp_arg(newpcb, es);
 
/* newpcb のコールバック関数tcp_recv lwip を初期化 */
tcp_recv(newpcb, tcp_client_recv);
 
/* newpcb のコールバック関数tcp_poll lwip を初期化 */
tcp_poll(newpcb, tcp_client_poll, 0);
 
 
/* LwIP tcp_sentコールバック関数の初期化 */
tcp_sent(newpcb, tcp_client_sent);
 
/* TCP データの処理 */
tcp_client_handle(newpcb, es);
 
ret_err = ERR_OK;
}
然も無くば
  
ret_errを返します。
}
/** このコールバックは、クライアントがサーバーからデータを受信したときに呼び出されます
※受信したデータが有効な場合、クライアントハンドル機能でデータを取り扱います
*/
静的err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
構造体 tcp_client_struct *es;
err_t ret_err;
 
LWIP_ASSERT("引数 != NULL",引数 != NULL);
 
es =(構造体tcp_client_struct*)引数;
 
/* サーバーから空の TCP フレームを受信した場合 => 接続を閉じる */
(p == NULL)の場合
{
/* リモートホストが接続を閉じました */
es->state = ES_CLOSING;
if(es->p == NULL)
{
/* 送信が完了したので、接続を閉じる */
tcp_client_connection_close(tpcb、es);
}
然も無くば
{
/* まだ終わっていません */
/* 受信したパケットの確認応答 */
tcp_sent(tpcb, tcp_client_sent);
 
/* 残りのデータを送信*/
tcp_client_send(tpcb、es);
}
ret_err = ERR_OK;
}
/* else : 空でないフレームがサーバから受信されたが、何らかの理由で err != ERR_OK */
else if(err != ERR_OK)
{
/* 無料受信 PBUF*/
(p != NULL)の場合
{
es->p = NULLです。
pbuf_free(p);
}
ret_err = err;
}
else if(es->state == ES_CONNECTED)
{
/* 受信 pbuf (チェーン) への参照を格納する */
es->p = p;
 
tcp_sentは、最初にすでに初期化されています。
/* LwIP tcp_sentコールバック関数の初期化 */
tcp_sent(tpcb, tcp_client_sent);
 
/* 受信したデータを確認する */
tcp_recved(tpcb、p->tot_len);
 
/* 受信したデータを処理する */
tcp_client_handle(tpcb, es);
 
pbuf_free(p);
 
ret_err = ERR_OK;
}
else if(es->state == ES_CLOSING)
{
/* 奇数ケース、リモート側が 2 回クローズ、データ (trash data) */
tcp_recved(tpcb、p->tot_len);
es->p = NULLです。
pbuf_free(p);
ret_err = ERR_OK;
}
然も無くば
{
/* 不明な es->state, trash データ */
tcp_recved(tpcb、p->tot_len);
es->p = NULLです。
pbuf_free(p);
ret_err = ERR_OK;
}
ret_errを返します。
}
 
 
static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
err_t ret_err;
構造体 tcp_client_struct *es;
 
es =(構造体tcp_client_struct*)引数;
if (es != NULL)
{
(es->p != NULL)の場合
{
tcp_sentは、最初にすでに初期化されています。
tcp_sent(tpcb, tcp_client_sent);
/* PBUF (チェーン) が残っているので、データを送信してみてください */
tcp_client_send(tpcb、es);
}
然も無くば
{
/* PBUF (チェーン) が残っていません */
if(es->状態==ES_CLOSING)
{
/* TCP接続を閉じる */
tcp_client_connection_close(tpcb、es);
}
}
ret_err = ERR_OK;
}
然も無くば
{
/* 何もすることがない */
tcp_abort(tpcb);
ret_err = ERR_ABRT;
}
ret_errを返します。
}
 
/** このコールバックは、クライアントから送信されたデータをサーバーが確認応答するときに呼び出されます
*送信するデータがこれ以上残っていない場合は、接続を閉じるだけです
*/
static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
構造体 tcp_client_struct *es;
 
LWIP_UNUSED_ARG(len);
 
es =(構造体tcp_client_struct*)引数;
es->retries = 0;
 
if(es->p != NULL)
{
tcp_sentは、最初にすでに初期化されています。
/* まだ pbufs が送られている */
tcp_sent(tpcb, tcp_client_sent);
 
 
tcp_client_send(tpcb、es);
}
然も無くば
{
/* 送信するデータがなくなり、クライアントが接続を閉じた場合*/
if(es->状態==ES_CLOSING)
tcp_client_connection_close(tpcb、es);
}
ERR_OKを返します。
}
 
 
/** サーバーにデータを送信する関数
*/
static void tcp_client_send(struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
構造体 pbuf *ptr;
err_t wr_err = ERR_OK;
 
while ((wr_err == ERR_OK) &&
(es->p != NULL) &&
(es->p->len <= tcp_sndbuf(tpcb)))
{
 
/* es 構造体から pbuf へのポインタを取得 */
ptr = es->p;
 
/* 送信用のデータをキューに入れる */
wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
 
if (wr_err == ERR_OK)
{
u16_t plen;
u8_t解放された。
 
plen = ptr->len;
 
/* チェーン内の次の PBUF (存在する場合) を続行する */
es->p = ptr->next;
 
if(es->p != NULL)
{
/* ES->p のインクリメント参照カウント */
pbuf_ref(es->p);
}
 
/* チェーンから最初の PBUF を切り刻む */
する
{
/* PBUF の解放に一生懸命努力する */
解放された = pbuf_free(ptr);
}
while(freed == 0);
/* より多くのデータを読み込めるようになりました */
tcp_recved(tpcb、plen);
}
else if(wr_err == ERR_MEM)
{
/* メモリが不足しているので、後で試してみてください / もっと頑張って、ポーリングを延期してください */
es->p = ptr;
}
然も無くば
{
/* その他の問題 ??*/
}
}
}
 
 
static void tcp_client_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
 
/* すべてのコールバックを削除 *//* 受信 TCP データを処理する */
 
static void tcp_client_handle (struct tcp_pcb *tpcb, struct tcp_client_struct *es)
{
/* リモート IP の取得 */
ip4_addr_t inIP = tpcb->remote_ip;
uint16_t inPort = tpcb->remote_port;
 
/* IP の抽出 */
char *remIP = ipaddr_ntoa(&inIP);
 
}
}

問題のデバッグを手伝ってください。

提供されたサンプル コードを使用して正しいネットワーク構成を確保しても、 MULTICH_CONNECT_PCBを試行すると、一貫して -4 という複雑な戻り値が返されます。 ネットワーク設定、ファイアウォール構成、コード実装の確認など、トラブルシューティングの努力にもかかわらず、問題は解決しませんでした。 仲間のコミュニティメンバーが集まって支援を提供し、ポートの競合のチェック、コードの段階的なデバッグ、パケットスニッフィングツールを使用したネットワークトラフィックの分析など、調査の可能性のある領域を提案しました。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/695522

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは@gauravbhirud

プロジェクト全体を添付できますか。 ファイル -> インポート -> DAVE™プロジェクトを使用します。

感謝

スジャータ

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/699199

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはスジャータ

 

添付ファイルを見つけてください。

 

感謝

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/XMC/TCP-IP-Client-Server-using-LWIP-stack/m-p/699330

0 件の賞賛