📄 tcp.lst
字号:
429
430 /* Then just set parameters and send SYN */
431
432 soc->rem_ip = ip;
433 soc->remport = rport;
434 soc->locport = myport;
435 soc->flags = 0;
436 soc->send_mtu = TCP_DEF_MTU;
437
438 /* get initial sequence number */
439
440 soc->send_unacked = tcp_initseq();
441 soc->send_next = soc->send_unacked + 1;
442 soc->myflags = TCP_FLAG_SYN;
443 tcp_sendcontrol(sochandle);
444 tcp_newstate(soc, TCP_STATE_SYN_SENT);
445
446 return(sochandle);
447 }
448
449
450
451 /** \brief Send user data over TCP using given TCP socket
452 * \ingroup tcp_app_api
453 * \author
454 * \li Jari Lahti (jari.lahti@violasystems.com)
455 * \date 25.07.2002
456 * \param sockethandle handle to TCP socket to be used for sending data
457 * \param buf pointer to data buffer (start of user data)
458 * \param blen buffer length in bytes (without space reserved at the
459 * beginning of buffer for headers)
460 * \param dlen length of user data to be sent (in bytes)
461 * \return
462 * \li -1 - Error
463 * \li >0 - OK (number represents number of bytes actually sent)
464 *
465 * \warning
466 * \li <i>buf</i> parameter is a pointer to data to be sent in
467 * user buffer. But note that there <b>MUST</b> be sufficient
468 * free buffer space before that data for TCP header (of #MIN_TCP_HLEN
469 * size).
470 *
471 * Invoke this function to initiate data sending over TCP connection
472 * established over a TCP socket. Since data is not buffered (in order
473 * to reduce RAM memory consumption) new data can not be sent until
474 * data that was previously sent is acknowledged. So, application knows when
475 * it can send new data either by:
476 * \li waiting for TCP_EVENT_ACK in event_listener function
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 9
477 * \li invoking tcp_check_send() function to check if it is possible
478 * to send data
479 *
480 */
481 INT16 tcp_send (INT8 sockethandle, UINT8* buf, UINT16 blen, UINT16 dlen)
482 {
483 struct tcb* soc;
484 UINT8 i;
485
486
487 TCP_DEBUGOUT("Entering to send TCP data packet\r\n");
488
489 kick_WD();
490
491 if( sockethandle < 0 ) {
492 TCP_DEBUGOUT("ERROR:Socket Handle not valid (<0)\r\n");
493 return(-1);
494 }
495
496 if( sockethandle > NO_OF_TCPSOCKETS ) {
497 TCP_DEBUGOUT("ERROR:Socket Handle not valid (>NO_OF_TCPSOCKETS)\r\n");
498 return(-1);
499 }
500
501 soc = &tcp_socket[sockethandle]; /* Get socket */
502
503 if(soc->state != TCP_STATE_CONNECTED) {
504 TCP_DEBUGOUT("TCP is not connected!!\r\n");
505 return(-1);
506 }
507
508 if(soc->send_unacked != soc->send_next) {
509 TCP_DEBUGOUT("TCP contains unacked data, cannot send more\r\n");
510 return(-1);
511 }
512
513 if( dlen > blen )
514 dlen = blen;
515
516 if(dlen + MIN_TCP_HLEN > soc->send_mtu) {
517 if(soc->send_mtu > MIN_TCP_HLEN)
518 dlen = soc->send_mtu - MIN_TCP_HLEN;
519 else
520 return(-1);
521 }
522
523 soc->send_next += dlen;
524
525 soc->myflags = TCP_FLAG_ACK | TCP_FLAG_PUSH;
526 process_tcp_out(sockethandle, buf - MIN_TCP_HLEN, blen + MIN_TCP_HLEN + 1, dlen);
527
528 return(dlen);
529 }
530
531
532 /** \brief Initiate TCP connection closing procedure
533 * \ingroup tcp_app_api
534 * \author
535 * \li Jari Lahti (jari.lahti@violasystems.com)
536 * \date 21.07.2002
537 * \param sochandle handle to socket on which TCP connection is to be closed
538 * \return
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 10
539 * \li -2 - there is unacked data on this socket. Try again later.
540 * \li -1 - Error
541 * \li >=0 - OK (connection closing procedure started. Handle to socket
542 * returned)
543 *
544 * Invoke this function to start connetion closing procedure over a given
545 * socket. Note that connection is not immediately closed. It may take some
546 * time for that to happen. Event_listener function will be invoked with
547 * appropriate event when that really happens.
548 */
549 INT8 tcp_close (INT8 sochandle)
550 {
551 struct tcb* soc;
552
553 TCP_DEBUGOUT("FUNCTION: tcp_close\r\n");
554
555 if( NO_OF_TCPSOCKETS < 0 )
556 return(-1);
557
558 if( NO_OF_TCPSOCKETS == 0 )
559 return(-1);
560
561 if( sochandle > NO_OF_TCPSOCKETS ) {
562 TCP_DEBUGOUT("Socket handle non-valid\r\n");
563 return(-1);
564 }
565
566 if( sochandle < 0 ) {
567 TCP_DEBUGOUT("Socket handle non-valid\r\n");
568 return(-1);
569 }
570
571 soc = &tcp_socket[sochandle]; /* Get referense */
572
573 switch(soc->state) {
574 case TCP_STATE_LISTENING:
575 tcp_newstate(soc, TCP_STATE_CLOSED);
576 break;
577
578 case TCP_STATE_SYN_RECEIVED:
579 soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
580 soc->send_unacked++;
581 soc->send_next++;
582 tcp_sendcontrol(sochandle);
583 tcp_newstate(soc, TCP_STATE_FINW1);
584 break;
585
586 case TCP_STATE_SYN_SENT:
587
588 tcp_newstate(soc, TCP_STATE_CLOSED);
589
590 break;
591
592 case TCP_STATE_FINW1:
593 case TCP_STATE_FINW2:
594 case TCP_STATE_CLOSING:
595 case TCP_STATE_TIMED_WAIT:
596 case TCP_STATE_LAST_ACK:
597
598 /* We are closing already */
599
600 break;
C51 COMPILER V7.06 TCP 11/26/2004 11:32:45 PAGE 11
601
602 case TCP_STATE_CONNECTED:
603
604 /* Is there unacked data? */
605
606 if(soc->send_unacked == soc->send_next ) {
607 /* There is no unacked data */
608
609 soc->myflags = TCP_FLAG_ACK | TCP_FLAG_FIN;
610 soc->send_next++;
611 tcp_sendcontrol(sochandle);
612 tcp_newstate(soc, TCP_STATE_FINW1);
613 } else {
614 /* Can't do much but raise pollable flag to soc->flags */
615 /* and process it on tcp_poll */
616
617 soc->flags |= TCP_INTFLAGS_CLOSEPENDING;
618
619
620 return(sochandle);
621 }
622
623 break;
624
625 default:
626 return(-1);
627 }
628
629 return(sochandle);
630
631 }
632
633
634
635 /** \brief Get current state of the socket
636 * \ingroup tcp_app_api
637 * \author
638 * \li Jari Lahti (jari.lahti@violasystems.com)
639 * \date 21.07.2002
640 * \param sochandle handle to the socket to be queried
641 * \return
642 * \li -1 - Error
643 * \li >0 - Socket state
644 *
645 * Use this function for querying socket state. This is usually not needed
646 * directly, but could be usefull for some special purposes.
647 */
648 INT8 tcp_getstate (INT8 sochandle)
649 {
650 struct tcb* soc;
651
652 if( NO_OF_TCPSOCKETS < 0 )
653 return(-1);
654
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -