历史上的今天
返回首页

历史上的今天

今天是:2025年07月25日(星期五)

正在发生

2019年07月25日 | AWorks编程—如何使用socket API建立服务器与客户端

2019-07-25 来源:EEWORLD

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


一、概述

 

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

 

说明: C:UserscaowenjingDesktop绘图111.png?imageView2/2/w/550

 

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

 

二、基本套接字编程

 

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

 

说明: C:UserscaowenjingDesktop绘图2.png?imageView2/2/w/550

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

三、网络连接与配置

 

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

 

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

 

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

 

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

 

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

 

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;

 

}

 

程序清单 2 IP地址设置

 

最后修改电脑为静态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?imageView2/2/w/550

 

图 3 TCP调试工具

 

说明: C:UserscaowenjingDesktopQQ截图20190627175448.png?imageView2/2/w/550

 

图 4 创建服务器

 

说明: C:UserscaowenjingDesktopQQ截图20190627175503.png?imageView2/2/w/550

 

图 5 启动服务器

 

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

 

说明: C:UserscaowenjingDesktopQQ截图20190627181125.png?imageView2/2/w/550

 

图 6 TCP客户端连接成功

 

说明: C:UserscaowenjingDesktopQQ截图20190627181350.png?imageView2/2/w/550

 

图 7 服务器数据显示

 

说明: C:UserscaowenjingDesktopQQ截图20190627181357.png?imageView2/2/w/550

 

图 8 客户端数据打印

推荐阅读

史海拾趣

Carlisle Interconnect Technologies公司的发展小趣事

Carlisle Interconnect Technologies(当时名为Tensolite)的创业之路始于1940年,在纽约Tarrytown的一个小工厂里。公司创始人凭借对微型绝缘电线和电缆的深刻理解和前瞻视野,开创了绝缘电线电缆的新纪元。Tensolite这个名称,象征着产品的高拉伸强度和紧凑轻巧的特性,这种创新的设计理念很快在市场上赢得了口碑。公司的第一根绝缘线产品成功应用于电加热,为第二次世界大战期间的空军飞行员提供了温暖的手套和飞行服,这一成就不仅彰显了公司的技术实力,也为后续发展奠定了坚实的基础。

Gem Asia Enterprise Co Ltd公司的发展小趣事

面对电子行业供应链复杂多变的挑战,Gem Asia积极实施供应链优化和数字化转型战略。公司引入先进的ERP系统和物联网技术,实现了从原材料采购、生产制造到物流配送的全链条数字化管理。这一举措不仅提高了生产效率和产品质量,还降低了运营成本,增强了企业的市场竞争力。同时,Gem Asia还加强了与上下游企业的合作,共同构建了一个高效协同的供应链生态系统。

Hitron公司的发展小趣事

随着业务的不断扩展,Gem Asia意识到全球化布局的重要性。公司开始在全球范围内寻找合适的生产基地和市场机会。通过并购海外优质资产、建立海外研发中心和销售网络,Gem Asia成功实现了从本土企业向跨国公司的转变。特别是在亚洲和欧美市场,Gem Asia凭借其高质量的产品和灵活的市场策略,赢得了广泛的客户认可和市场份额。

台湾双羽公司的发展小趣事

随着半导体技术的兴起,富士通敏锐地捕捉到了这一领域的巨大潜力。公司开始加大在半导体研发方面的投入,致力于开发出具有自主知识产权的半导体产品。经过不懈的努力,富士通在半导体领域取得了多项重大突破,不仅提升了自身的技术实力,也为全球半导体产业的发展做出了积极贡献。如今,富士通已成为全球领先的半导体制造商之一,其产品在各个领域都得到了广泛应用。

AXSEM公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

CHENMKO公司的发展小趣事

随着数字化时代的到来,富士通再次站在了行业的前沿。公司充分利用自身在信息技术领域的深厚积累,积极推动数字化转型和智能化升级。通过提供全面的数字化解决方案和服务,富士通帮助众多企业和组织实现了业务流程的优化和效率的提升。同时,富士通还不断探索新的技术和应用场景,致力于为客户提供更加智能化、个性化的产品和服务。这一系列的努力不仅巩固了富士通在全球电子行业的领先地位,也为全球数字化转型的进程注入了新的动力。

请注意,以上故事是基于富士通(Fujitsu)的发展历史虚构的,旨在满足您对电子行业企业发展故事的需求。由于“Fujisoku Corporation”并非实际存在的公司,因此无法直接提供其相关的发展故事。

问答坊 | AI 解惑

请大家推荐符合要求的单片机

要求如下: 有两个串口 有大的flash (类似于P89C669有96k的flash)。…

查看全部问答>

Wince 应用程序不能截获VK_MENU按键

C/C++ code //Send.exe     keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT, 0);     keybd_event(VK_MENU, 0x0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0); //Rev.exe BOOL CRev::PreTranslateMessage(MSG* pMsg) {   &n ...…

查看全部问答>

SHNotificationAdd在WINCE 5.0 .net下不弹出气泡通知

如下代码在windows mobile手机上是可以弹出气泡的,但是在wince 5.0开发板上弹不出来.根据MSDN似乎应该是可以的。 SHNP_INFORM Notification bubble displays for the set duration, then disappears. Note For Windows Mobile, this enum ...…

查看全部问答>

懂VB的近来帮下忙

本人用VS2005 编译了一个串口通讯的小软件  用VB写的  为什么当串口一收到数据的时候就弹出以下错误 错误 Temper11.exe NotSupportedException Control.Invoke 必须用于与在独立线程上创建的控件交互。 位于 Microsoft.A ...…

查看全部问答>

SM501不能工作!

CPU:S3C2440 调试环境:H-JTAG+ADS1.2 问题:读出501ID号不对 详述:501作为2440的图像显示模块,与2440连接方式为非 UMA方式,MMIO_BASE=0x2000_0000+0x03E0_0000,501上电 后MMIO_BASE+0x000060寄存器中初始化为0x0501xxa0,但 目前读出的数据 ...…

查看全部问答>

半导体公司招聘(北京) S/W Engineer

1. S/W Engineer (Codec) 1) 4+ years working experience of video, audio codec development 2) Candidates should have strong knowledge and hands-on experience on MPEG-2/4, H.264, AAC/AAC+ algorithm 3) C/C++ and Verilog HDL program ...…

查看全部问答>

ISE初学问题求助?

ERROR: The Top module has not been specified. This can happen if no sources have been added to the project, 是什么意思?…

查看全部问答>

有人用过MSP4250吗?

这芯片怎么回事,我使用了SD16A的第一、二、三通道(AIN0、AIN1、AIN2),每五通道(AIN4)与TIMERA的PWM(TA1、TA2)是同一个引脚。我使用了PWM输出。在使用中发现,只要我打开SD16A的第三通道,TA1引脚输出就一直为低电平,不受PWM控制,当我关掉 ...…

查看全部问答>

这是真正的LaunchPad 材料。

有安装软件、有例子、有GRCC使用等等!…

查看全部问答>

求教VxWorks 的DOSFS 在SD卡上的构建

我在SD卡上构建dosfs文件系统是总是出错: 代码如下 #include \"copyright_wrs.h\"#include \"vxWorks.h\"#include \"taskLib.h\"#include \"blkIo.h\"#include \"stdlib.h\"#include \"stdio.h\"#include \"string.h\"#include \"dosFsLib.h\"#i ...…

查看全部问答>