addeed some dns client code
This commit is contained in:
		| @ -143,9 +143,73 @@ printf ("ON TCP READ DATA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %d\n", dlen); | |||||||
| 	return 0; | 	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) | 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"); | 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; | 	return 0; | ||||||
| } | } | ||||||
| @ -187,20 +251,18 @@ static void on_tcp_disconnect (mio_dev_sck_t* dev) | |||||||
| 	int status; | 	int status; | ||||||
|  |  | ||||||
| 	/* UNABLE TO CONNECT or CONNECT TIMED OUT */ | 	/* UNABLE TO CONNECT or CONNECT TIMED OUT */ | ||||||
| 	if (reqmsgxtn->rtries <= 0)  | 	 | ||||||
| 	{ |  | ||||||
| 	status = mio_geterrnum(mio); | 	status = mio_geterrnum(mio); | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		status = mio_geterrnum(mio); |  | ||||||
| 	} |  | ||||||
| MIO_DEBUG2 (mio, "TCP UNABLED TO CONNECT .. OR DISCONNECTED ... ---> %d -> %js\n", status, mio_errnum_to_errstr(status)); | MIO_DEBUG2 (mio, "TCP UNABLED TO CONNECT .. OR DISCONNECTED ... ---> %d -> %js\n", status, mio_errnum_to_errstr(status)); | ||||||
|  |  | ||||||
| 	if (MIO_LIKELY(reqmsgxtn->on_reply)) | 	if (MIO_LIKELY(reqmsgxtn->on_reply)) | ||||||
| 		reqmsgxtn->on_reply (dnc, reqmsg, status, MIO_NULL, 0); | 		reqmsgxtn->on_reply (dnc, reqmsg, status, MIO_NULL, 0); | ||||||
|  |  | ||||||
| 	release_dns_msg (dnc, reqmsg); | 	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) | 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. */ | 	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. */ | 	/* 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->dev = (mio_dev_t*)dnc->tcp_sck; | ||||||
| 	reqmsgxtn->rtries = 0; | 	reqmsgxtn->rtries = 0; /* i don't retry with tcp. so reset this to 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); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return 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 (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; | pkt->tc = 1; | ||||||
| //////////////////////// | //////////////////////// | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user