中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

上海市住房與城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站國(guó)際外貿(mào)網(wǎng)絡(luò)交易平臺(tái)

上海市住房與城鄉(xiāng)建設(shè)委員會(huì)網(wǎng)站,國(guó)際外貿(mào)網(wǎng)絡(luò)交易平臺(tái),真正免費(fèi)建站的網(wǎng)站,網(wǎng)絡(luò)科技加我qq是干嘛網(wǎng)絡(luò)協(xié)議棧LwIP WiFi UDP Clinet編程 WiFi UDP Server編程 WiFi TCP Client編程 WiFi TCP Server編程 一。LWIP原理介紹,API介紹,文件結(jié)構(gòu) 1.Lwip支持的協(xié)議 2.API 3.文件結(jié)構(gòu) 1.api目錄:應(yīng)用程序接口文件。 2.arch目錄:與硬件和…

網(wǎng)絡(luò)協(xié)議棧LwIP

WiFi UDP Clinet編程

WiFi UDP Server編程

WiFi TCP Client編程

WiFi TCP Server編程

一。LWIP原理介紹,API介紹,文件結(jié)構(gòu)

1.Lwip支持的協(xié)議

2.API

3.文件結(jié)構(gòu)

1.api目錄:應(yīng)用程序接口文件。

2.arch目錄:與硬件和OS有關(guān)的文件,包括網(wǎng)絡(luò)驅(qū)動(dòng)、移植需要修改的文件。

3.core目錄:LwIP的核心代碼,包括ICMP、IP、UDP、TCP等協(xié)議的實(shí)現(xiàn)等。

4.include目錄:LwIP的包含文件。

5.netif目錄:PPP協(xié)議和LwIP網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序的模板,提供了網(wǎng)絡(luò)接口驅(qū)動(dòng)程序的基本框架。

4.Socket 通信模型

Socket是一個(gè)網(wǎng)絡(luò)編程接口

Socket類型:

(1)流式套接字(SOCK_STREAM)

(2)數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)

(3)原始套接字(SOCK_RAW)

5.Socket API

socket:創(chuàng)建一個(gè)套接字

bind:將本地端口號(hào)和IP地址綁定到套接字上

listen:TCP監(jiān)聽

accept:TCP監(jiān)聽接受處理

connect:TCP客戶端連接

select:特殊套接字設(shè)置

send/sendto:發(fā)送數(shù)據(jù)包到已連接/未連接套接字上

recv/recvfrom:接收數(shù)據(jù)包從已連接/未連接套接字上

getsockopt/setsockopt:獲取/改變套接字選項(xiàng)

getpeername/getsockname:獲取遠(yuǎn)端/本地地址信息

close:關(guān)閉套接字

shutdown:按設(shè)置關(guān)閉套接字

gethostbyname/gethostbyaddr:地址域名映射

read:從套接字緩存讀數(shù)據(jù)

write:向套接字緩存寫數(shù)據(jù)

目的:

Lwip協(xié)議棧的實(shí)現(xiàn)目的,無(wú)非是要上層用來(lái)實(shí)現(xiàn)app的socket編程。 為了兼容性,lwip的socket通過(guò)宏定義提供標(biāo)準(zhǔn)的socket接口函數(shù)

5.介紹常用的API

(1)int socket (int domain, int type, int protocol);

????????1.domain 是地址族

PF_INET ?// internet IPv4協(xié)議

PF_INET6 // internet IPv6協(xié)議

PF_UNSPEC ? ? ?// 用戶協(xié)議

????????2.type ?// 套接字類型

SOCK_STREAM ? // 流式套接字

SOCK_DGRAM ? ?// 數(shù)據(jù)報(bào)套接字 S

OCK_RAW ? ? ? ? // ?原始套接字

????????3.protocol //參數(shù)通常置為0 ?? ?

IPPROTO_IP ? ? ?0 ?? ?

IPPROTO_TCP ? ? 6 ?? ?

IPPROTO_UDP ? ? 17

(2)int bind (int sockfd, struct sockaddr* addr, int addrLen);

????????1.sockfd 由socket() 調(diào)用返回

? ? ? ? 2.addr 是指向 sockaddr_in 結(jié)構(gòu)的指針,包含本機(jī)IP 地址和端口號(hào)

struct sockaddr_in{

????????u_short sin_family // protocol family

????????u_short sin_port ? ? // port number

}

struct in_addr ?sin_addr ?//IP address (32-bits)
? ? ? ? 3.addrLen : sizeof (struct sockaddr_in)

(3)地址結(jié)構(gòu)

地址的數(shù)據(jù)結(jié)構(gòu)

通用地址結(jié)構(gòu)struct sockaddr{    u_short  sa_family;    // 地址族, AF_xxxchar  sa_data[14];     // 14字節(jié)協(xié)議地址};Internet協(xié)議地址結(jié)構(gòu)struct sockaddr_in{           u_short sin_family;      // 地址族, AF_INET,2 bytesu_short sin_port;      // 端口,2 bytesstruct in_addr sin_addr;  // IPV4地址,4 bytes 	char sin_zero[8];        // 8 bytes unused,作為填充}; 
IPv4地址結(jié)構(gòu)
// internet address  
struct in_addr
{in_addr_t  s_addr;            // u32 network address 
};

使用方法

1.定義一個(gè)struct sockaddr_in類型的變量并清空

struct sockaddr_in myaddr;
memset(&myaddr, 0, sizeof(myaddr));

2.填充地址信息

myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(8888); 
myaddr.sin_addr.s_addr = inet_addr(“192.168.1.100”);

3.將該變量強(qiáng)制轉(zhuǎn)換為struct sockaddr類型在函數(shù)中使用

bind(listenfd, (struct sockaddr*)(&myaddr), sizeof(myaddr));

(4)地址轉(zhuǎn)換函數(shù)

1.unsigned long inet_addr(char *address);

????????address是以’\0’結(jié)尾的點(diǎn)分IPv4字符串。該函數(shù)返回32位的地址。如果字符串包含的不是合法的IP地址,則函數(shù)返回-1。例如:

struct in_addr addr;
addr.s_addr = inet_addr(" 192.168.1.100 ");

2.char* inet_ntoa(struct in_addr address);

????????address是IPv4地址結(jié)構(gòu),函數(shù)返回一指向包含點(diǎn)分IP地址的靜態(tài)存儲(chǔ)區(qū)字符指針。如果錯(cuò)誤則函數(shù)返回NULL。

(5)獲取/發(fā)送套接字

獲取套接字

int?getsockopt(int sock, int level,int optname, void *optval, socklen_t *optlen);

發(fā)送套接字

int?setsockopt(int sock, int level,int optname, const void *optval, socklen_t optlen);

參數(shù):

sock:將要被設(shè)置或者獲取選項(xiàng)的套接字。

level:選項(xiàng)所在的協(xié)議層。

optname:需要訪問(wèn)的選項(xiàng)名。

optval:對(duì)于getsockopt(),指向返回選項(xiàng)值的緩沖。對(duì)于setsockopt(),指向包含新選項(xiàng)值的緩沖。

optlen:對(duì)于getsockopt(),作為入口參數(shù)時(shí),選項(xiàng)值的最大長(zhǎng)度。作為出口參數(shù)時(shí),選項(xiàng)值的實(shí)際長(zhǎng)度。對(duì)于setsockopt(),現(xiàn)選項(xiàng)的長(zhǎng)度。

返回說(shuō)明: 成功執(zhí)行時(shí),返回0。

失敗返回-1,errno被設(shè)為以下的某個(gè)值

EBADF:sock不是有效的文件描述詞

EFAULT:optval指向的內(nèi)存并非有效的進(jìn)程空間

EINVAL:在調(diào)用setsockopt()時(shí),optlen無(wú)效

ENOPROTOOPT:指定的協(xié)議層不能識(shí)別選項(xiàng)

ENOTSOCK:sock描述的不是套接字

(6)listen監(jiān)聽

int listen (int sockfd, int backlog);

sockfd:監(jiān)聽連接的套接字。

backlog 指定了正在等待連接的最大隊(duì)列長(zhǎng)度,它的作用在于處理可能同時(shí)出現(xiàn)的幾個(gè)連接請(qǐng)求。 DoS(拒絕服務(wù))攻擊即利用了這個(gè)原理,非法的連接占用了全部的連接數(shù),造成正常的連接請(qǐng)求被拒絕。 返回值: 0 或 -1。

完成listen()調(diào)用后,socket變成了監(jiān)聽socket(listening socket).

(7)accept

int?accept(int?sockfd,?struct?sockaddr?*addr, socklen_t?*addrlen) ;

返回值:已建立好連接的套接字或-1
sockfd : 監(jiān)聽套接字?
addr : 對(duì)方地址
addrlen:地址長(zhǎng)度

(8)connect

int?connect(int?sockfd,?struct?sockaddr?*serv_addr, int?addrlen);

返回值:0 或 -1

sockfd : socket返回的文件描述符

serv_addr : 服務(wù)器端的地址信息 ?

addrlen : serv_addr的長(zhǎng)度

(9)send/sendto

ssize_t  send(int  socket,  const  void  *buffer,  size_t  length, int flags);
ssize_t  sendto(int s, const void *data, size_t size, int flags,const struct sockaddr *to, socklen_t tolen);

返回值: 成功:實(shí)際發(fā)送的字節(jié)數(shù) 失敗:-1, 并設(shè)置errno

頭文件: #include <sys/socket.h>

buffer : 發(fā)送緩沖區(qū)首地址 length : 發(fā)送的字節(jié)數(shù) flags : 發(fā)送方式(通常為0)

(10)recv/recvfrom

ssize_t  recv(int  socket,  const  void  *buffer,  size_t  length, int flags);
ssize_t  recvfrom(int s, void *mem, size_t len, int flags,struct sockaddr *from, socklen_t *fromlen);

返回值: 成功:實(shí)際接收的字節(jié)數(shù) 失敗:-1,并設(shè)置errno

buffer : 發(fā)送緩沖區(qū)首地址

length : 發(fā)送的字節(jié)數(shù)

flags : 接收方式(通常為0)

(11)套接字關(guān)閉

int close(int sockfd);
int shutdown(int sockfd, int howto);

close是雙向通信的關(guān)閉

TCP連接是雙向的(是可讀寫的),當(dāng)我們使用close時(shí),會(huì)把讀寫通道都關(guān)閉,有時(shí)侯我們希望只關(guān)閉一個(gè)方向,這個(gè)時(shí)候我們可以使用shutdown。針對(duì)不同的howto,系統(tǒng)回采取不同的關(guān)閉方式。 howto = 0 關(guān)閉讀通道,但是可以繼續(xù)往套接字寫數(shù)據(jù)。 howto = 1 和上面相反,關(guān)閉寫通道。只能從套接字讀取數(shù)據(jù)。 howto = 2 關(guān)閉讀寫通道,和close()一樣

二。實(shí)驗(yàn):WiFi UDP Clinet編程

1.功能分析

完成UDP Client功能開發(fā)

(1)PC模擬UDP Server,指定(IP,PORT),等待Client數(shù)據(jù)

(2)UDP Client向Sever發(fā)送“I am Client!”

(3)Sever收到數(shù)據(jù)后,向Client發(fā)送“I am Server!”

2.功能實(shí)現(xiàn)

(1)在SDK目錄下新建udpclient目錄

(2)拷貝Station目錄下所有文件到udpclient目錄下

(3)在user目錄下新建udpclient.c

(4)在include目錄下新建udpclient.h

(1)Sourceinsight配置

在之前的工程中,移除AP文件夾 添加udpclient文件夾

添加lwip文件夾

同步:

發(fā)現(xiàn)的問(wèn)題:

QQ的截屏比SourceInsight復(fù)制優(yōu)先級(jí)低,即先復(fù)制代碼,在截屏之后粘貼還是復(fù)制的代碼

3.代碼實(shí)現(xiàn)

1.在udpclient.c下,添加《整體復(fù)制粘貼

(1)udpclient初始化

(2)udpclient任務(wù)

#include "esp_common.h"#include "freertos/FreeRTOS.h"
#include "freertos/task.h"#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#include "udpclient.h"#define SERVERADDR "192.168.3.12"//注意:這是wifi分配的ip地址,會(huì)變化
#define SERVERPORT 8000
/******************************************************************************* FunctionName : ATaskUdpClient* Description  : ATaskUdpClient 任務(wù)* Parameters   : none* Returns      : none
*******************************************************************************/
void ATaskUdpClient( void *pvParameters )
{int iVariableExample = 0;int fd = -1;int NetTimeOnt = 5000;int ret;struct sockaddr_in ServerAddr;char udpmsg[48];STATION_STATUS StaStatus;do {StaStatus = wifi_station_get_connect_status();vTaskDelay(100);}while(StaStatus != STATION_GOT_IP);fd = socket(PF_INET,SOCK_DGRAM,0);if(fd == -1){printf("get socket fail!\n");vTaskDelete(NULL);}setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,&NetTimeOnt,sizeof(int));memset(&ServerAddr,0,sizeof(ServerAddr));ServerAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = inet_addr(SERVERADDR);ServerAddr.sin_port = htons(SERVERPORT);ServerAddr.sin_len = sizeof(ServerAddr);for(;;){sendto(fd,"I am UdpClient!",sizeof("I am UdpClient!"),0,(struct sockaddr *)&ServerAddr,(socklen_t)ServerAddr.sin_len);do{ret = recvfrom(fd,udpmsg,48,0,(struct sockaddr *)&ServerAddr,(socklen_t*)(&ServerAddr.sin_len));if(ret > 0){printf("UdpServer:%s\n",udpmsg);}else{printf("UdpServer data is no!\n");}}while(ret == -1);}vTaskDelete( NULL );
}
/******************************************************************************* FunctionName : UdpClient_init* Description  : UdpClient_init 初始化* Parameters   : none* Returns      : none
*******************************************************************************/
void UdpClient_init(void)
{xTaskCreate(ATaskUdpClient, "UdpClient", 256, NULL, 4, NULL);
}

?注意:上述的IPv設(shè)置的是本機(jī)的IP地址

Win+R---》cmd進(jìn)入命令行

輸入ipconfig查詢無(wú)線網(wǎng)絡(luò)ipv4地址

對(duì)上述代碼的解釋

<1>判斷是否獲取到IP地址

<2>創(chuàng)建socket

<3>設(shè)置接收超時(shí)時(shí)間

<4>賦值server信息

<5>發(fā)送數(shù)據(jù)到server端

<6>從server端接收數(shù)據(jù)

2.在udpclient.h下聲明《整體復(fù)制》

#ifndef __UART_H__
#define __UART_H__#ifdef __cplusplus
extern "C" {
#endifvoid ATaskUdpClient( void *pvParameters );
void UdpClient_init(void);#ifdef __cplusplus
}
#endif#endif

3.在user_main中

UdpClient_init();

5.運(yùn)行方式

(1)創(chuàng)建一個(gè)UDP,ip為本機(jī)被分配的無(wú)線ipv4地址,端口為程序代碼設(shè)置的端口

查詢IP地址(通過(guò)ipconfig命令獲取本機(jī)ip地址

(2)建立串口通訊,波特率為74880,關(guān)閉RTS,使用終端模式

4.結(jié)果

(1)串口中打印從UDP服務(wù)器傳輸過(guò)來(lái)的數(shù)據(jù)(123)

三。實(shí)驗(yàn):WiFi UDP Server編程

1.功能分析

實(shí)驗(yàn)要求:
完成UDP Server功能開發(fā)

1.PC模擬UDP Client,指定UDP Server (IP,PORT),發(fā)送“I am Client!”

2.Sever收到數(shù)據(jù)后,向Client發(fā)送“I am Server!”

2.功能實(shí)現(xiàn)

新建udpserver工程目錄

1.在SDK目錄下新建udpserver目錄

2.拷貝udpclient目錄下所有文件到udpserver目錄下

新建udpserver源碼文件

1.在user目錄下新建udpserver.c

2.在include目錄下新建udpserver.h

Sourceinsight配置

1.在之前的工程中,移除udpclient文件夾

2.添加udpserver文件夾

3.代碼實(shí)現(xiàn)

1.復(fù)制之前udpclient代碼到udpserver上,進(jìn)行修改

? ? (1)重命名UdpClient_init為UdpServer_init

? ? (2)重命名ATaskUdpClient為ATaskUdpServer

2.修改user_main.c

? ? (1)包涵udpserver.h

? ? (2)在user_init里修改為UdpServer_init

代碼的詳細(xì)解釋

1.判斷是否獲取到IP地址

2.創(chuàng)建socket

3.Serveraddr 信息設(shè)置

4.設(shè)置接收超時(shí)時(shí)間

5.綁定socket

6.從Client端接收數(shù)據(jù)

7.發(fā)送數(shù)據(jù)到Client端

結(jié)果:

四。WiFi TCP Client編程

1.功能分析

實(shí)驗(yàn)要求:

完成TCP Client功能開發(fā)

1.PC模擬TCP Server,指定(IP,PORT),等待Client數(shù)據(jù)

2.TCP Client向Sever發(fā)送“I am Client!”

3.Sever收到數(shù)據(jù)后,向Client發(fā)送“I am Server!”

2.功能實(shí)現(xiàn)

新建tcpclient工程目錄

1.在SDK目錄下新建tcpclient目錄

2.拷貝udpclient目錄下所有文件到tcpclient目錄下

新建tcpclient源碼文件

1.在user目錄下新建tcpclient.c

2.在include目錄下新建tcpclient.h

Sourceinsight配置

1.在之前的工程中,移除udpserver文件夾

2.添加tcpclient文件夾

3.代碼實(shí)現(xiàn)

1.復(fù)制之前udpclient代碼到tcpclient上,進(jìn)行修改

? ? (1)重命名UdpClient_init為TcpClient_init

? ? (2)重命名ATaskUdpClient為ATaskTcpClient

2.修改user_main.c

? ??(1)包涵tcpclient.h

? ? (2)在user_init里修改為TcpClient_init

代碼詳細(xì)解釋

1.判斷是否獲取到IP地址

2.創(chuàng)建socket

3.設(shè)置接收超時(shí)時(shí)間

4.賦值server信息

5.連接到server端

6.發(fā)送數(shù)據(jù)到server端

7.從server端接收數(shù)據(jù)

五。實(shí)驗(yàn):WiFi TCP Server編程

1.功能分析

實(shí)驗(yàn)要求:

完成TCP Server功能開發(fā)

1.PC模擬TCP Client,指定Server(IP,PORT)

? ? (1)進(jìn)行連接,連接成功后發(fā)生“I am Client!”

? ? (2)Sever收到數(shù)據(jù)后,向Client發(fā)送“I am Server!”

2.功能實(shí)現(xiàn)

新建tcpserver工程目錄

1.在SDK目錄下新建tcpserver目錄

2.拷貝tcpclient目錄下所有文件到tcpserver目錄下

新建tcpserver源碼文件

1.在user目錄下新建tcpserver.c

2.在include目錄下新建tcpserver.h

Sourceinsight配置

1.在之前的工程中,移除tcpclient文件夾

2.添加tcpserver文件夾

3.代碼實(shí)現(xiàn)

1.復(fù)制之前tcpclient代碼到tcpserver上,進(jìn)行修改

? ? (1)重命名TcpClient_init為TcpServer_init

? ? (2)重命名ATaskTcpClient為ATaskTcpServer

2.修改user_main.c

? ? (1)包涵tcpserver.h

? ? (2)在user_init里修改為TcpServer_init

代碼詳解

1.判斷是否獲取到IP地址

2.創(chuàng)建socket

3.設(shè)置接收超時(shí)時(shí)間

4.賦值server信息

5.綁定socket

6.監(jiān)聽socket

7.處理Client 連接

8.接收Client 數(shù)據(jù)

9.發(fā)送數(shù)據(jù)到Server

10.關(guān)閉socket

http://www.risenshineclean.com/news/49548.html

相關(guān)文章:

  • 企業(yè)做自己的網(wǎng)站要注意什么seo分析
  • 從哪里設(shè)置網(wǎng)站關(guān)鍵詞建站公司網(wǎng)站源碼
  • 石家莊學(xué)校網(wǎng)站建設(shè)關(guān)鍵路徑
  • 建筑企業(yè)網(wǎng)站模板站內(nèi)優(yōu)化包括哪些
  • 網(wǎng)站開發(fā)有沒(méi)有前途網(wǎng)站建設(shè)加推廣優(yōu)化
  • 深圳查詢建設(shè)項(xiàng)目規(guī)劃的網(wǎng)站百度seo優(yōu)化教程免費(fèi)
  • 介紹一學(xué)一做視頻網(wǎng)站百度如何優(yōu)化排名靠前
  • 服裝電子商務(wù)網(wǎng)站有哪些網(wǎng)絡(luò)違法犯罪舉報(bào)網(wǎng)站
  • 網(wǎng)頁(yè)上本地網(wǎng)站搜索怎樣做營(yíng)銷型網(wǎng)站制作公司
  • php技術(shù)應(yīng)用于中小企業(yè)網(wǎng)站開發(fā)上海谷歌優(yōu)化
  • 天津制作網(wǎng)頁(yè)東莞seo托管
  • 蘭州易天網(wǎng)站建設(shè)公司有哪些?產(chǎn)品策劃方案怎么做
  • 廣州十大純?cè)O(shè)計(jì)公司seo難不難學(xué)
  • 網(wǎng)站建設(shè)訂單模板下載長(zhǎng)沙seo網(wǎng)站優(yōu)化公司
  • 最便宜的網(wǎng)站建設(shè)2023年最新新聞簡(jiǎn)短摘抄
  • 蘭州拼團(tuán)網(wǎng)站建設(shè)競(jìng)價(jià)賬戶托管哪家好
  • 從零開始做網(wǎng)站數(shù)據(jù)庫(kù)精準(zhǔn)客戶運(yùn)營(yíng)推廣
  • 微信公眾號(hào)網(wǎng)站導(dǎo)航怎么做百度優(yōu)化推廣
  • 建筑公司網(wǎng)站有哪些國(guó)家新聞最新消息今天
  • wordpress 自定義注冊(cè)表單前端seo優(yōu)化
  • 百度關(guān)鍵字優(yōu)化安徽seo網(wǎng)絡(luò)推廣
  • wordpress插件加密seo搜索引擎優(yōu)化哪家好
  • wordpress圖片網(wǎng)站關(guān)鍵詞研究工具
  • 哪些網(wǎng)站可以做百科參考資料目前最好的引流推廣方法
  • 臺(tái)州做網(wǎng)站是什么站長(zhǎng)之家seo概況查詢
  • 網(wǎng)站建設(shè)信息公開和解讀回應(yīng)網(wǎng)站優(yōu)化怎么操作
  • 網(wǎng)站的ico圖標(biāo)做多大國(guó)內(nèi)的搜索引擎有哪些
  • 行業(yè)網(wǎng)站建設(shè)搜索引擎營(yíng)銷特點(diǎn)是什么
  • 有個(gè)網(wǎng)站專做品牌 而且價(jià)格便宜百度商店
  • 溫州人才網(wǎng)站開發(fā)汕頭seo優(yōu)化公司