Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
11 years, 7 months ago.
TCPサーバへの接続失敗?
初めまして。 mbed NXP LPC1768 上でTCPサーバを動かしているのですが、 クライアントから接続/切断を繰り返すと5回目の接続時にacceptがtimeoutしてしまいます。
色々とググっては見たのですが特に有用な情報はないようでした。
下記のコードで再現すると思うのですが、何かまずい部分でもあるのでしょうか... ちなみに、EthernetInterfaceとrtosはいずれもmbed-officialのものを使用しています。
#include "mbed.h" #include "EthernetInterface.h" #include "TCPSocketServer.h" #include "TCPSocketConnection.h" DigitalOut myled(LED1); EthernetInterface eth; TCPSocketServer server; char receiveBuf[1024]; #define PORT 1234 int main() { eth.init(); eth.connect(); printf("IP Address is %s\r\n", eth.getIPAddress()); while(1) { printf("Binding(%d)...", PORT); if (server.bind(PORT) < 0) { printf("Could not bind server socket to port '%d'.\n\r", PORT); return -1; } printf("OK\r\n"); printf("Listening..."); if (server.listen() < 0) { printf("Could not put server socket into listening mode.\n\r"); return -1; } printf("OK\r\n"); // enable timeout. server.set_blocking(false); while(1) { TCPSocketConnection connection; bool isConnected = false; printf("Waiting Connect..."); if( server.accept(connection) == 0 ) { printf("Connected.\r\n"); isConnected = true; connection.set_blocking(false, 10000); while( isConnected ) { int result = connection.receive(receiveBuf, sizeof(receiveBuf)); switch(result) { case 0: case -1: isConnected = false; break; default: printf("receive %dbytes.\r\n", result); break; } } connection.close(); printf("Disconnected.\r\n"); // break; } else { printf("Timeout.\r\n"); } } server.close(); } }
36行目のset_blockingコメントアウトしてacceptでタイムアウトしないようにすると何度でも接続/切断できます。
少しTCPSocketServerのソースを見たのですが、set_blockingでタイムアウトするように設定すると、 selectで待ち受けを行うようです。これ以上は深く潜ってないのですが、何か情報ご存知の方いらっしゃいますでしょうか。
また、コード上まずそうな部分があれば、ご指摘いただけると幸いです。
1 Answer
11 years, 7 months ago.
この質問は日本語フォーラム(https://mbed.org/forum/ja/topic/4367/)へ移動しましました。