udp sendmsg函式分析

2021-05-27 12:47:55 字數 2699 閱讀 1606

宣告:本人也是初學者,錯誤在所難免,希望大家發現後能指出,不勝感激。願共同進步

480 int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,  size_t len)

482

//將資料傳送出去

520                 } //

釋放上鎖的套接字時

521                 release_sock(sk);

522         }

//ulen加上udp首部的長度。

523         ulen += sizeof(struct udphdr);

524 

525         /*

526          *      get and verify the address. 

527          */

//檢查struct msghdr結構的msg_name欄位,確定目的位址是否合法。

struct msghdr結構詳見

//判斷目的位址是否為空

528         if (msg->msg_name)

536 

//如果上述語句執行順利,則把上層應用程式的套接字位址賦給本函式。

537                 daddr = usin->sin_addr.s_addr;

538                 dport = usin->sin_port;

539                 if (dport == 0)

540                         return -einval;

541         } else

//接下來的一句不明白,求指點

551         ipc.addr = inet->saddr;

設定為socket bind的inte***ce

553         ipc.oif = sk->sk_bound_dev_if;

//如果是控制報文,則呼叫ip_cmsg_send函式處理報文。從函式名字上看,好像是要傳送cmsg,然而實際上卻沒有任何資料傳送。

554         if (msg->msg_controllen)

562         if (!ipc.opt)

563                 ipc.opt = inet->opt;

564 

565         saddr = ipc.addr;

566         ipc.addr = faddr = daddr;

567 

568         if (ipc.opt && ipc.opt->srr)

574         tos = rt_tos(inet->tos);

//確定是否需要路由資訊

575         if (sk->sk_localroute || (msg->msg_flags & msg_dontroute) || 

576             (ipc.opt && ipc.opt->is_strictroute))

580 

581         if (multicast(daddr))

//如果已經建立了套接字連線,則不需要重新查詢路由

//直接從套接字的管理結構中返回路由表資訊 ,並記錄到rt 中

589         if (connected)

590                 rt = (struct rtable*)sk_dst_check(sk, 0);

//如果rt為空,即無路由資訊,則先用struct flowi結構記錄查詢路由表的索引資訊,再呼叫ip_route_output_flow函式查詢路由表,得到路由資訊。

642         up->len += ulen;

//對udp資料報進行分片處理,為ip層分片處理做好準備

647                 udp_flush_pending_frames(sk);

//上層應用指定flags為msg_more時,corkreq為1

648         else if (!corkreq)

649                 err = udp_push_pending_frames(sk, up);

650         release_sock(sk);

651 

652 out:

653         ip_rt_put(rt);

654         if (free)

655                 kfree(ipc.opt);

656         if (!err)

660         return err;

661 

662 do_confirm:

663         dst_confirm(&rt->u.dst);

664         if (!(msg->msg_flags&msg_probe) || len)

665                 goto back_from_confirm;

666         err = 0;

667         goto out;

668 }

669

OSTaskCreate()函式分析

int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...

getopt函式分析

函式getopt主要用於拆分命令列引數,用這個函式就不自己寫命令列引數解析程式了,以下 摘自tcpdump原始碼,對這個函式比較感興趣,故對此進行分析注釋,因水平實在不敢恭維,不足之處希望能一起 函式getopt 有三個引數,nargc,nargv就是命令列傳過來的argc和argv字串ostr,它...

uCOS OSTaskCreate()函式分析

int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...