嵌入式 网络编程

本文深入探讨了嵌入式系统中的TCP网络编程,从TCP协议的基础概念开始,介绍了套接字(socket)作为通信基石的重要性。详细阐述了socket的创建、绑定、监听、接受和连接等关键步骤,并提供了服务器和客户端的源代码示例。文章还提到了将服务器改造成多线程模式以支持多个客户端连接,并展示了如何处理数据,包括将接收到的字符串转换为大写并回传给客户端。最后,文章提及了交叉编译和在开发板上运行程序的步骤。
摘要由CSDN通过智能技术生成

1.查看while源代码
前言

TCP(传输控制协议)
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作

嵌套字
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

系统调用
1.socket

原型:
int socket(int domain, int type,int protocol)

 

参数    解释    用法
domain    网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).    AF_UNIX只能够用于单一的Unix 系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程主机之间通信(当我们 man socket时发现 domain可选项是 PF_而不是AF_,因为glibc是posix的实现所以用PF代替了AF,不过我们都可以使用的).
type    网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)    SOCK_STREAM表明使用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流.SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信.
protocol    由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了    
说明:socket为网络通讯做基本的准备.成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况.
2.bind

 

原型:
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)


参数    解释
sockfd    由socket调用返回的文件描述符
addrlen    sockaddr结构的长度
my_addr    一个指向sockaddr的指针. 在中有 sockaddr的定义
不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义
struct sockaddr_in{
                unsigned short          sin_family;    
                unsigned short int      sin_port;
                struct in_addr          sin_addr;
                unsigned char           sin_zero[8];
        }



我们主要使用Internet所以
sin_family一般为AF_INET,
sin_addr设置为INADDR_ANY表示可以和任何的主机通信,
sin_port是我们要监听的端口号.sin_zero[8]是用来填充的.
说明:bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样 .
3.listen

原型
int listen(int sockfd,int backlog)

参数    解释
sockfd    是bind后的文件描述符
backlog    设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度.
说明: listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.
4.accept

原型
int accept(int sockfd, struct sockaddr *addr,int *addrlen)


参数    解释
sockfd    
addr/addrlen    是用来给客户端的程序填写的,服务器端只要传递指针就可以了
5.connect

原型
int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)


参数    解释
sockfd    socket返回的文件描述符
serv_addr    储存了服务器端的连接信息.其中sin_add是服务端的地址
addrlen    serv_addr的长度
说明:connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.

2.编译并在ubuntu下运行
编译
gcc -o server-while-tcp.out server-while-tcp.c
gcc -o client.out client.c


运行
./server-while-tcp.out
./client.out 192.168.1.***     //新的窗口打开


watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBzbWlsZV4,size_20,color_FFFFFF,t_70,g_se,x_16
watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBzbWlsZV4,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

3.修改服务器为多线程模式
功能

1.多线程发送数据,即一个服务器对应多个客户端,最多可以同时监听10个客户端。
2.客户端向服务器发起连接请求,成功后打印连接信息。
3.客户端向服务器发送数据后,服务器端打印数据。
4.服务器将得到的数据全部转换为大写后返回到客户端。
5.客户端打印出从服务器端返回的数据。

server(服务器端)源码

#include <sys/types.h>      /* 网络编程所需头文件*/
#include <sys/socket.h>     /* 网络编程所需头文件*/
#include <string.h>
#include <netinet/in.h>     /* 包含类似inet_ntoa函数的头文件 */
#include <arpa/inet.h>      /* 包含类似inet_ntoa函数的头文件 */
#include <unistd.h>         /* 包含close函数、forck函数等系统调用函数的头文件 */
#include <stdio.h>      
#include <signal.h>         /* 包含signal函数的头文件 */

#define SERVER_PORT 8888        /* 监听端口号 */
#define BACKLOG 10              /* listen函数中最大同时监听连接路数 */

/* socket              

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值