标签:
1 int
2 lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)
3 {
4 ..................
5 sock = get_socket(s); // 根据socket()函数返回的socket号取得socket在lwip中的完整结构体
6 if (!sock)
7 return -1;
8 .................
9 local_addr.addr = ((const struct sockaddr_in *)name)->sin_addr.s_addr;
10 local_port = ((const struct sockaddr_in *)name)->sin_port;
11 .................
12 err = netconn_bind(sock->conn, &local_addr, ntohs(local_port)); // 主要工作在这个函数里
13 .................
14 return 0;
15 }
1 err_t
2 netconn_bind(struct netconn *conn, struct ip_addr *addr, u16_t port)
3 {
4 struct api_msg msg;
5
6 LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;);
7
8 msg.function = do_bind; // api_msg 的用法在socket创建那一篇文章中已经介绍过,我们已经这道实际上之后会调用到do_bind函数
9 msg.msg.conn = conn;
10 msg.msg.msg.bc.ipaddr = addr;
11 msg.msg.msg.bc.port = port;
12 TCPIP_APIMSG(&msg);
13 return conn->err;
14 }
1 err_t
2 tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
3 {
4 .............
5 if (!ip_addr_isany(ipaddr)) { // 如果用户传入的ip地址不是0,就把用户传入的ip地址记到pcb里
6 pcb->local_ip = *ipaddr;
7 }
8 pcb->local_port = port; // 把用户传入的端口号记到pcb里
9 ..............
10 }
1 static void
2 tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
3 {
4 ..........
5 /* If we don‘t have a local IP address, we get one by
6 calling ip_route(). */
7 if (ip_addr_isany(&(pcb->local_ip))) {
8 netif = ip_route(&(pcb->remote_ip));
9 if (netif == NULL) {
10 return;
11 }
12 ip_addr_set(&(pcb->local_ip), &(netif->ip_addr)); // 设置pcb的ip地址
13 }
14 ..........
15 }
标签:
原文地址:http://www.cnblogs.com/codingfun/p/4187546.html