这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » AWorks编程:如何使用socketAPI建立服务器与客户端?

共7条 1/1 1 跳转至

AWorks编程:如何使用socketAPI建立服务器与客户端?

工程师
2021-08-16 23:58:12     打赏

摘要:socket在计算机通信领域被称为“套接字”,是网络通信的一种方式,在AWorks系统中如何使用socket API建立服务器与客户端,进行数据通信呢?本文将详细为你介绍。

一、概述

要编写通过计算机网络通信的程序,首先要确定这些程序相互通信使用的协议,通常使用TCP或UDP协议族。TCP是面向连接的传输协议,建立连接时需要经过三次握手,断开连接时需要经过四次握手,中间传输数据也要回复ACK包进行确认。而UDP是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单的把数据丢到网络中,也不明确区分服务器和客户端。因此TCP比UDP协议更加可靠,且TCP和UDP编程大致相同,所以本文就以TCP协议为例,建立图 1所示的基本客户/服务器网络模型,进行通信。

说明: C:UserscaowenjingDesktop绘图111.png

图 1 基本服务器-客户端模型

二、基本套接字编程

图2给出了一对客户与服务器进程之间发生的典型事件的时间表。服务器首先启动,稍后客户端启动连接到服务器。所有的客户和服务器都从调用socket开始,它返回套接字描述符;客户随后调用connect,服务器则调用bind、listen和accept;建立连接之后调用send、recv函数进行数据传输。数据传输完成后,套接字使用标准的closesocket函数关闭。

说明: C:UserscaowenjingDesktop绘图2.png

图2 基本客户/服务器程序的套接字函数

socket()函数:指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP等)创建套接字。

blind()函数:将套接字与本地的IP地址和端口绑定。

connect()函数:客户端向服务器发出连接请求。

listen()函数:仅服务器调用,使套接字进入被动监听状态。所谓被动监听是指当没有客户端请求时,套接字处于“睡眠”状态,只有当接收到客户端请求时,套接字才会被唤醒来响应请求。

accept()函数:当套接字处于监听状态时,可以通过aceept函数来接收客户端的请求。

send/recv()函数:发送和接收函数。

closesocket()函数:关闭套接字,回收资源。

三、网络连接与配置

socket通信程序基于网络之上,常规的开发板一般都携带以太网外设,所以本文以以太网为例,配置开发板的网络连接。

首先需要用网线连接开发板的网口和电脑,来建立网络的物理连接。其次在aworks sdk包中的aw_prj_params.h文件中打开以太网设备宏,如程序清单 1。

程序清单 1 打开以太网配置宏

#define AW_DEV_IMX1050_ENET   /**< brief iMX1050 ENET (有线网卡) */

再次在awbl_hwconf_imx1050_enet.h文件中配置以太网的IP地址、子网掩码和网关,并关闭dhcp,使用静态的IP地址,如程序清单 2。

程序清单 2 IP地址设置 

aw_local char *__get_ipaddr (void)
{
    return "192.168.1.10";
}
aw_local char *__get_netmsk (void)
{
    return "255.255.255.0";
}
aw_local char *__get_gateway (void)
{
    return "192.168.1.1";
}
. . . .
aw_local bool_t __get_dhcp_en (void)
{
    return FALSE;
}

最后修改电脑为静态IP地址并与开发板IP地址位于同一网段。

四、TCP客户端实例

按照基本的套接字编程流程,建立一个客户端,我们只需要调用socket、connect、send、recv、closesocket函数即可,如程序清单 3,首先使用socket创建一个TCP类型的套接字,再调用connect连接到已指定的服务器(IP地址为192.168.1.34、端口号为4000),当服务器端接收客户端的连接请求后,connect函数退出阻塞状态,进入循环,再在循环中调用send函数向服务器发送数据,调用recv函数(阻塞)接收数据。当数据传输完成后,使用closesocket关闭连接,回收资源。

程序清单 3 回声客户端程序

#include "aworks.h"
#include "aw_delay.h"
#include "aw_task.h"
#include "net/aw_net.h"
#include "net/aw_sockets.h"
#include
/* 客户端访问的服务器IP地址 */
#define REMOTE_SERVER_ADDR          "192.168.1.34"      /* 对应服务器的 IP 地址,用户需要根据具体创建的服务端的IP地址修改 */
#define REMOTE_SERVER_PORT          4000                  /* 客户端访问服务器端口 */
/**
* brief net 示例程序入口
* return 无
*/
void demo_tcp_client_entry (void)
{
    struct sockaddr_in server_addr;
    int rcv_len;
    int sock;
    char net_buf[1500];
    memset(net_buf,'',1500);
    /* 设置客户端访问的服务器IP地址、端口号 */
    inet_aton(REMOTE_SERVER_ADDR, &server_addr.sin_addr);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(REMOTE_SERVER_PORT);
    server_addr.sin_len = sizeof(server_addr);
    aw_kprintf("TCP client: connecting...rn");
    while(1) {
        sock = socket(AF_INET, SOCK_STREAM, 0);/* 创建socket套接字 */
        if (sock < 0) {
            aw_kprintf("TCP server socket failed!rn");
            return;
        }
        /* 连接服务器  */
       if (0 == connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr))) {
            aw_kprintf("TCP client: connected.rn");
            while(1) {
                send(sock, "hello,i'm tcp client.", 21, 0); /* 向服务器发送数据 */
                rcv_len = recv(sock, net_buf, sizeof(net_buf), 0);/* 接收服务器发送的数据 */
                if (rcv_len <= 0) {
                    aw_kprintf("TCP client: disconnect. ret=%d, err=%drn", rcv_len, errno);
                    break;
                }
                aw_kprintf("recv:%srn",net_buf);/*打印数据*/
                memset(net_buf,'',1500);/*清空缓存区*/
            }
        }
        closesocket(sock); /* 关闭此连接 */
        aw_mdelay(1000);
    }
}

程序编写完成后,我们使用TCP上位机软件测试。打开TCP调试软件,如图 3。创建服务器,如图 4。最后启动服务器,如图 5。 

说明: C:UserscaowenjingDesktopQQ截图20190627174919.png

图 3 TCP调试工具

说明: C:UserscaowenjingDesktopQQ截图20190627175448.png

图 4 创建服务器

说明: C:UserscaowenjingDesktopQQ截图20190627175503.png

图 5 启动服务器

以上步骤就绪后,在主程序中调用demo_tcp_client_entry()入口函数,编译、下载程序到开发板,待程序运行之后,可以在shell界面看到TCP客户端连接成功,如图 6,此时在上位机软件上可以看到建立的TCP连接,在发送区域向客户端发送数据,在接收区将看到客户端回发的数据,如图 7。shell界面打印客户端收到的数据,如图 8。

说明: C:UserscaowenjingDesktopQQ截图20190627181125.png

图 6 TCP客户端连接成功

说明: C:UserscaowenjingDesktopQQ截图20190627181350.png

图 7 服务器数据显示

说明: C:UserscaowenjingDesktopQQ截图20190627181357.png

图 8 客户端数据打印




关键词: AWorks     socket     数据通信    

专家
2021-08-17 00:02:48     打赏
2楼

感谢楼主的分享,很实用了。


专家
2021-08-17 00:13:26     打赏
3楼

感谢楼主的分享,很实用了。


专家
2021-08-17 09:32:05     打赏
4楼

学习学习


工程师
2021-08-17 10:15:51     打赏
5楼

aworks 是ZLG出品的软件中间件吧? 


工程师
2021-08-17 10:41:49     打赏
6楼

看起来这个软件很强大嘛!


工程师
2021-08-17 11:25:25     打赏
7楼

有时间想试试这个aworks


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]