嵌入式Linux应用开发——网络编程、多线程编程(所学课程来源百问网)

目录

一、网络编程

1.1网络通信

1.2IP和端口

1.3TCP编程示例

1.3.1服务器程序编写

1.3.2客户端程序编写

1.3.3程序编写过程中的错误

1.4UDP编程

1.4.1服务器程序

1.42客户端程序

二、多线程编程

2.1线程的标识pthread_t

2.2创建线程

2.3信号量

2.4互斥量

2.5条件变量


一、网络编程

1.1网络通信

1.2IP和端口

网络通信本质上也是数据的传输,数据传输三要数:源、目的、长度

源:由IP端口来确定

1.3TCP编程示例

1.3.1服务器程序编写

1.使用socket(),指定使用的连接方式

2.调用bind(),绑定socket

sin_port:我们要使用htons将主机的字节序转化为网络字节序。

sin_addr:是结构体,给其中的s_addr赋值

sin_zeor[8]:需要清零

3.监听socket

4.调用accpet,等待连接

这里的结构体,存储的是客户端的数据。

5.发送数据

调用fork函数,产生一个子进程,在分支语句中,子进程会进入if,而父进程不会执行if语句里的操作,这样的话,在发送消息的过程中,服务器还可以继续接收其他客户端的连接。

if(!fork()){
					/*子进程的源码*/
					while(1){
						/*接收客户端数据*/
						recvlen = recv(iclientsocket,recvbuf,999,0);
						if(recvlen <= -1){
							close(iclientsocket);
							return -1;
						}
						else{
							recvbuf[recvlen] = '\0';
							printf("get msg from client %d : %s\n",clinetnum,recvbuf);
						}
					}
				}

1.3.2客户端程序编写

1.也是先调用socket

2.调用connect()

这里结构体参数要传递的是服务器的ip

3.当连接成功后,就可以发送数据

while (1){
		if(fgets(sendbuf,999,stdin)){
			sendlen = send(iclientsocket,sendbuf,strlen(sendbuf),0);
			if(sendlen <= 0){
				close(iclientsocket);
				r[]eturn -1;
			}
		}
	}

1.3.3程序编写过程中的错误

1.传递结构体参数,要传递的是结构体的地址。

2.对于accept函数最后一个长度参数是指针类型,所以应该传递地址,而不能直接用sizeof

3.对于子进程,可以在父进程中使用signal()为它收尸,否则他会变成僵尸进程。

signal(SIGCHLD,SIG_IGN);

4.第一次运行程序时,客户端发送完消息后会直接关闭,是因为if语句中的判断条件写错了,写代码过程中要注意判断条件是否正确。

5.使用交叉编译产生的可执行程序,不能再虚拟机上运行

1.4UDP编程

1.4.1服务器程序

对于UDP的服务器程序编写,少了listen和accept两个步骤,转而采用recvfrom替代recv。

注意要修改socket里的参数。

1.42客户端程序

UDP的客户端程序与TCP的客户端程序基本相同,但是UDP的客户端可以不用connect进行连接,直接使用sendto()就可以进行数据发送。

二、多线程编程

进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

2.1线程的标识pthread_t

对于进程而言,每一个进程都有一个唯一对应的PID号来表示该进程,而对 于线程而言,也有一个“类似于进程的 PID 号”,名为 tid,其本质是一个 pthread_t 类型的变量。线程号与进程号是表示线程和进程的唯一标识,但是对于线程号而言,其仅仅在其所属的进程上下文中才有意义。

2.2创建线程

第一个参数为pthread_t指针,用来保存新建线程的线程号;

 第二个参数表示了线程的属性,一般传入NULL表示默认属性;

第三个参数是一个函数指针,就是线程执行的函数。这个函数返回值为void*, 形参为void*。  

第四个参数则表示为向线程处理函数传入的参数,若不传入,可用NULL填充

2.3信号量

2.4互斥量

2.5条件变量

所学视频来源

4_8-1.网络编程概念_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1w4411B7a4?p=72&vd_source=3a9afee9fda50350a1c881b4325e007d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值