我是靠谱客的博主 沉默小蘑菇,最近开发中收集的这篇文章主要介绍RT-Thread开发之路(3)— UDP通信和TCP客户端通信RT-Thread开发之路(3)— UDP通信和TCP客户端通信UDP通信和TCP客户端通信,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
RT-Thread开发之路(3)— UDP通信和TCP客户端通信
UDP通信和TCP客户端通信
在之前的基础上开始:RT-Thread开发之路(2)— 使用at_device软件包通过ESP8266连接到网络
一、UDP通信
首先包含需要使用的头文件:
#include <sys/socket.h>
#include "netdb.h"
然后创建一个socket
/* 创建一个socket,协议簇为AT Socket 协议栈,类型是SOCK_DGRAM,UDP类型 */
int sock_fd = socket(AF_AT,SOCK_DGRAM,0);
if (sock_fd == -1)
{
rt_kprintf("Socket errorn");
return 0;
}
接下来通过gethostbyname
函数获得要访问的远端IP地址信息
/* 通过函数参数获得host地址(如果是域名,会做域名解析) */
struct hostent *host;
host = (struct hostent *) gethostbyname("192.168.0.107");
接着设置IP地址端口号等一些信息,发送一个字符串过去
/* 初始化预连接的服务端地址 */
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12344);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
sendto(sock_fd, "Hello world!", sizeof("Hello world!"), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
发送完成之后就等待接收了
/* 等待接收对方发送的数据 */
struct sockaddr_in recv_addr;
socklen_t addrlen = sizeof(recv_addr);
char recvbuf[1024] = {0};
ret = recvfrom(sockfd, recvbuf, 1024, 0,(struct sockaddr*)&recv_addr,&addrlen); //1024表示本次接收的最大字节数
接收到数据之后将其打印出来:
rt_kprintf("recv :%s n",recvbuf);
在PC机上打开网络调试助手,可以收到信息,
然后发送消息到开发板,也可以收到
代码如下:
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <sys/socket.h>
#include "netdb.h"
int main(void)
{
int ret;
/* 创建一个socket,协议簇为AT Socket 协议栈,类型是SOCK_DGRAM,UDP类型 */
int sock_fd = socket(AF_AT,SOCK_DGRAM,0);
if (sock_fd == -1)
{
rt_kprintf("Socket errorn");
return 0;
}
// 2、绑定本地的相关信息,如果不绑定,则系统会随机分配一个端口号
struct sockaddr_in local_addr = {0};
local_addr.sin_family = AF_INET; //使用IPv4地址
local_addr.sin_addr.s_addr = inet_addr("192.168.0.103"); //本机IP地址
local_addr.sin_port = htons(12341); //端口
bind(sock_fd, (struct sockaddr*)&local_addr, sizeof(local_addr));//将套接字和IP、端口绑定
/* 通过函数参数获得host地址(如果是域名,会做域名解析) */
struct hostent *host;
host = (struct hostent *) gethostbyname("192.168.0.107");
/* 初始化预连接的服务端地址 */
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12344);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
ret = sendto(sock_fd, "Hello world!", sizeof("Hello world!"), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(ret > 0 )
rt_kprintf("send to okrn");
else {
rt_kprintf("send to err rn");
}
while (1)
{
/* 等待接收对方发送的数据 */
struct sockaddr_in recv_addr;
socklen_t addrlen = sizeof(recv_addr);
char recvbuf[1024] = {0};
recvfrom(sock_fd, recvbuf, 1024, 0,(struct sockaddr*)&recv_addr,&addrlen); //1024表示本次接收的最大字节数
rt_kprintf("recv :%s n",recvbuf);
}
/* 关闭这个socket */
closesocket(sock_fd);
return RT_EOK;
}
二、TCP通信
同样的,包含需要使用的头文件:
#include <sys/socket.h>
#include "netdb.h"
然后创建一个socket,类型改为TCP
/* 创建一个socket,协议簇为AT Socket 协议栈,类型是SOCK_STREAM,TCP类型 */
int sock_fd = socket(AF_AT,SOCK_STREAM,0);
if (sock_fd == -1)
{
rt_kprintf("Socket errorn");
return 0;
}
接下来通过gethostbyname
函数获得要连接的服务器的IP地址信息
/* 通过函数参数获得host地址(如果是域名,会做域名解析) */
struct hostent *host;
host = (struct hostent *) gethostbyname("192.168.0.107");
接着设置要连接的服务器的协议栈、IP地址和端口号等一些信息
/* 初始化要连接的服务端地址 */
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12344);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
然后连接到服务器
/* 连接到服务器 */
if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
{
rt_kprintf("Connect fail!n");
return 0;
}
然后发送一个消息到服务器
/* 发送数据到服务远端 */
const char send_data[] = "Hello, I am RT-Thread.";
send(sock_fd, send_data, strlen(send_data), 0);
发送完成之后就等待接收了
char recvbuf[1024] = {0};
while (1)
{
/* 等待接收服务端发送过来的数据,最大接收1024个字节 */
ret = recv(sock_fd, recvbuf, sizeof(recvbuf), 0);
/* 6、将接收到的数据打印出来 */
rt_kprintf("Recv date:%s n",recvbuf);
}
编译,烧录,运行,在PC机上打开网络调试助手,可以收到消息:
接着发送数据,可以看到,开发板接收到了消息
代码如下:
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include <sys/socket.h>
#include "netdb.h"
int main(void)
{
int ret;
/* 创建一个socket,协议簇为AT Socket 协议栈,类型是SOCK_STREAM,TCP类型 */
int sock_fd = socket(AF_AT,SOCK_STREAM,0);
if (sock_fd == -1)
{
rt_kprintf("Socket errorn");
return 0;
}
/* 通过函数参数获得host地址(如果是域名,会做域名解析) */
struct hostent *host;
host = (struct hostent *) gethostbyname("192.168.0.107");
/* 初始化预连接的服务端地址 */
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(12344);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
/* 连接到服务器 */
if (connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
{
rt_kprintf("Connect fail!n");
return 0;
}
/* 发送数据到服务远端 */
const char send_data[] = "Hello, I am RT-Thread.";
send(sock_fd, send_data, strlen(send_data), 0);
char recvbuf[1024] = {0};
while (1)
{
/* 等待接收服务端发送过来的数据,最大接收1024个字节 */
ret = recv(sock_fd, recvbuf, sizeof(recvbuf), 0);
/* 6、将接收到的数据打印出来 */
rt_kprintf("Recv date:%s n",recvbuf);
}
return RT_EOK;
}
最后
以上就是沉默小蘑菇为你收集整理的RT-Thread开发之路(3)— UDP通信和TCP客户端通信RT-Thread开发之路(3)— UDP通信和TCP客户端通信UDP通信和TCP客户端通信的全部内容,希望文章能够帮你解决RT-Thread开发之路(3)— UDP通信和TCP客户端通信RT-Thread开发之路(3)— UDP通信和TCP客户端通信UDP通信和TCP客户端通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复