目录
一、网络编程
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条件变量
所学视频来源