addeed some dns client code
This commit is contained in:
		| @ -143,9 +143,73 @@ printf ("ON TCP READ DATA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %d\n", dlen); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void on_tcp_reply_timeout (mio_t* mio, const mio_ntime_t* now, mio_tmrjob_t* job) | ||||
| { | ||||
| 	mio_dns_msg_t* reqmsg = (mio_dns_msg_t*)job->ctx; | ||||
| 	dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(reqmsg); | ||||
| 	mio_dev_sck_t* dev = (mio_dev_sck_t*)msgxtn->dev; | ||||
| 	mio_svc_dnc_t* dnc = ((dnc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnc; | ||||
|  | ||||
| 	MIO_ASSERT (mio, msgxtn->rtmridx == MIO_TMRIDX_INVALID); | ||||
| 	MIO_ASSERT (mio, dev == dnc->tcp_sck); | ||||
|  | ||||
| MIO_DEBUG0 (mio, "*** TIMEOUT ==> unable to receive dns response in time over TCP...\n"); | ||||
|  | ||||
| 	if (MIO_LIKELY(msgxtn->on_reply)) | ||||
| 		msgxtn->on_reply (dnc, reqmsg, MIO_ETMOUT, MIO_NULL, 0); | ||||
|  | ||||
| 	//release_dns_msg (dnc, reqmsg); | ||||
|  | ||||
| 	mio_dev_sck_halt(dev); | ||||
| } | ||||
|  | ||||
| static int on_tcp_write (mio_dev_sck_t* dev, mio_iolen_t wrlen, void* wrctx, const mio_skad_t* dstaddr) | ||||
| { | ||||
| 	mio_t* mio = dev->mio; | ||||
| 	mio_dns_msg_t* msg = (mio_dns_msg_t*)wrctx; | ||||
| 	dnc_dns_msg_xtn_t* msgxtn = dnc_dns_msg_getxtn(msg); | ||||
| 	mio_svc_dnc_t* dnc = ((dnc_sck_xtn_t*)mio_dev_sck_getxtn(dev))->dnc; | ||||
|  | ||||
| printf ("ON TCP WRITE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); | ||||
| 	if (wrlen <= -1) | ||||
| 	{ | ||||
| 		if (MIO_LIKELY(msgxtn->on_reply)) | ||||
| 			msgxtn->on_reply (dnc, msg, mio_geterrnum(mio), MIO_NULL, 0); | ||||
|  | ||||
| //		release_dns_msg (dnc, msg); | ||||
| 		mio_dev_sck_halt (dev); | ||||
| 	} | ||||
| 	else if (mio_dns_msg_to_pkt(msg)->qr == 0 && msgxtn->rmaxtries > 0) | ||||
| 	{ | ||||
| 		/* question. schedule to wait for response */ | ||||
| 		mio_tmrjob_t tmrjob; | ||||
|  | ||||
| 		MIO_MEMSET (&tmrjob, 0, MIO_SIZEOF(tmrjob)); | ||||
| 		tmrjob.ctx = msg; | ||||
| 		mio_gettime (mio, &tmrjob.when); | ||||
| 		MIO_ADD_NTIME (&tmrjob.when, &tmrjob.when, &msgxtn->rtmout); | ||||
| 		tmrjob.handler = on_tcp_reply_timeout; | ||||
| 		tmrjob.idxptr = &msgxtn->rtmridx; | ||||
| 		msgxtn->rtmridx = mio_instmrjob(mio, &tmrjob); | ||||
| 		if (msgxtn->rtmridx == MIO_TMRIDX_INVALID) | ||||
| 		{ | ||||
| 			/* call the callback to indicate this operation failure in the middle of transaction */ | ||||
| 			if (MIO_LIKELY(msgxtn->on_reply)) | ||||
| 				msgxtn->on_reply (dnc, msg, mio_geterrnum(mio), MIO_NULL, 0); | ||||
|  | ||||
| 			//release_dns_msg (dnc, msg); | ||||
| 			mio_dev_sck_halt (dev); | ||||
|  | ||||
| 			MIO_DEBUG0 (mio, "unable to schedule timeout...\n"); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* sent an answer - we don't need this any more */ | ||||
| 		/* we don't call the on_reply callback stored in msg->ctx as this is not a reply context */ | ||||
| //		release_dns_msg (dnc, msg); | ||||
| 		mio_dev_sck_halt (dev); | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| @ -187,20 +251,18 @@ static void on_tcp_disconnect (mio_dev_sck_t* dev) | ||||
| 	int status; | ||||
|  | ||||
| 	/* UNABLE TO CONNECT or CONNECT TIMED OUT */ | ||||
| 	if (reqmsgxtn->rtries <= 0)  | ||||
| 	{ | ||||
| 		status = mio_geterrnum(mio); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		status = mio_geterrnum(mio); | ||||
| 	} | ||||
| 	 | ||||
| 	status = mio_geterrnum(mio); | ||||
|  | ||||
| MIO_DEBUG2 (mio, "TCP UNABLED TO CONNECT .. OR DISCONNECTED ... ---> %d -> %js\n", status, mio_errnum_to_errstr(status)); | ||||
|  | ||||
| 	if (MIO_LIKELY(reqmsgxtn->on_reply)) | ||||
| 		reqmsgxtn->on_reply (dnc, reqmsg, status, MIO_NULL, 0); | ||||
|  | ||||
| 	release_dns_msg (dnc, reqmsg); | ||||
|  | ||||
| 	/* let's forget about the tcp socket */ | ||||
| 	dnc->tcp_sck = MIO_NULL;  | ||||
| } | ||||
|  | ||||
| static int switch_reqmsg_transport_to_tcp (mio_svc_dnc_t* dnc, mio_dns_msg_t* reqmsg) | ||||
| @ -249,14 +311,9 @@ static int switch_reqmsg_transport_to_tcp (mio_svc_dnc_t* dnc, mio_dns_msg_t* re | ||||
| 	if (mio_dev_sck_connect(dnc->tcp_sck, &cinfo) <= -1) return -1; /* the connect request hasn't been honored. */ | ||||
|  | ||||
| 	/* switch the belonging device to the tcp socket since the connect request has been acknowledged. */ | ||||
| 	MIO_ASSERT (mio, reqmsgxtn->rtmridx == MIO_TMRIDX_INVALID); /* ensure no timer job scheduled at this moment */ | ||||
| 	reqmsgxtn->dev = (mio_dev_t*)dnc->tcp_sck; | ||||
| 	reqmsgxtn->rtries = 0; | ||||
| 	if (reqmsgxtn->rtmridx != MIO_TMRIDX_INVALID) | ||||
| 	{ | ||||
| 		/* unschedule a timer job added for udp transport if any */ | ||||
| 		mio_deltmrjob (mio, reqmsgxtn->rtmridx); | ||||
| 		MIO_ASSERT (mio, reqmsgxtn->rtmridx == MIO_TMRIDX_INVALID); | ||||
| 	} | ||||
| 	reqmsgxtn->rtries = 0; /* i don't retry with tcp. so reset this to 0 */ | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| @ -296,6 +353,13 @@ static int on_udp_read (mio_dev_sck_t* dev, const void* data, mio_iolen_t dlen, | ||||
|  | ||||
| 		if (dev == (mio_dev_sck_t*)reqmsgxtn->dev && pkt->id == reqpkt->id && mio_equal_skads(&reqmsgxtn->servaddr, srcaddr, 0)) | ||||
| 		{ | ||||
| 			if (reqmsgxtn->rtmridx != MIO_TMRIDX_INVALID) | ||||
| 			{ | ||||
| 				/* unschedule a timer job if any */ | ||||
| 				mio_deltmrjob (mio, reqmsgxtn->rtmridx); | ||||
| 				MIO_ASSERT (mio, reqmsgxtn->rtmridx == MIO_TMRIDX_INVALID); | ||||
| 			} | ||||
|  | ||||
| //////////////////////// | ||||
| pkt->tc = 1; | ||||
| //////////////////////// | ||||
|  | ||||
		Reference in New Issue
	
	Block a user