読者です 読者をやめる 読者になる 読者になる

Intel GalileoでEthernet Libraryを使うとエラーがでる

電子工作

Ethernet Libraryを使ってHTTPでサーバに接続するプログラムを作ったのだけど
EthernetClientのstop関数を呼ぶとログに** B0100000063f694が出て動作が停止する


ググルとこんなのあるけど同じことしても解消しなかった
Ethernet Library: sketch crashes when remote cl... | Intel Communities


このファイルの\arduino-1.5.3\hardware\arduino\x86\libraries\Ethernet\EthernetClient.cpp
stop関数のソース見てたら_inactive_counterにアクセスしているあたりで
エラーが出ている。

void EthernetClient::stop()
{
	if (_sock < 0)
		return;

	connect_true = false;
	if (_inactive_counter != NULL)
		*_inactive_counter = 0;
	if(_sock != -1){
		close(_sock);
		_sock = -1;

		// Sketches do a Ethernet client = server.available() - which means a copy constructor is used
		// Hence any server which populated a pclients[idx] - won't actually see the socket closed - since
		// his client was copied - not given a pointer to.... pcleint[] in EthernetServer.cpp _sock != -1 at this point
		// make it so !
		if(_pCloseServer != NULL){
		    	_pCloseServer->closeNotify(this->id);
		}
	}
}

よく見ると_inactive_counterが初期されてないように見えるので、
とりあえずコンストラクタでNULLにしてみたらエラーが出なくなった


EthernetServer.cpp

		for(int sock = 0; sock < MAX_SOCK_NUM && success == 0; sock++){
			if (pclients[sock]._sock == -1){
				pclients[sock]._sock = ret;
				pclients[sock]._pCloseServer = this;
				pclients[sock].connect_true = true;
				pclients[sock]._inactive_counter = &_pcli_inactivity_counter[sock];
				success = 1;
			}
		}

EthernetServerから使われるときはポインタに値が入るみたいだ
これでいいのかな...