宣告:本人也是初學者,錯誤在所難免,希望大家發現後能指出,不勝感激。願共同進步
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位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...