回顾:
信号量集 - semaphore arrays
1 key = ftok(); 2 semid = semget();
3 semctl(semid,0,SETVAL,10);
信号量集 就可以使用。
4 semop() 实现+1 或 -1.
5 semctl()删除
计数器组成的数组
网络编程(socket编程)
服务端
1 socket() -> sockfd
2 准备通信地址 sockaddr sockaddr_un sockaddr_in
3 绑定 bind()
4 读写sockfd,实现信息交互
5 close(sockfd);
客户端
第三步换 connect()函数,用法和bind()没有区别。其它一样。
今天:
socket本地通信,实用性不如消息队列。
socket网络通信和本地通信代码差不多,唯一区别在于通信地址的不同。
网络通信时,端口和IP地址都需要使用转换函数:
端口转换函数: htons() 本地 转 网络
IP地址转换函数: int inet_addr(char*) 点分 转 十六
一对多的通信
TCP的一对多通信
服务器端:
1 socket()得到socket描述符,参数type必须SOCK_STREAM
2 准备通信地址,端口和IP 需要使用转换函数
3 绑定 bind()
4 用listen()函数 监听客户端
5 用accept()函数,等待客户端的连接,如果没有连接,阻塞,如果有客户端连接,返回一个 新的socket描述符,用于读写数据。
6 读写数据read()/write()
7 关闭对应的socket
客户端
与一对一的完全一样。
memset() 函数可以清空 buf.
练习:
修改tcpserver2.c和tcpclient.c,实现:
客户端加上输入(scanf),要求能多次输入,输入bye退出
客户端输入一句,发送给服务器一句。
服务器能多次接受同一客户端的数据,并且把客户端发过来的数据 发回给客户端。
思路: while(1) { 数据交互 ; 遇到bye break;}
如何提示写代码能力:
1 尽量实现:不看任何的代码写出当天代码。
2 在当天的代码上能自由的分段(功能模块)。
3 找一些能实现的课外的代码(新的)。
TCP编程的经验:
1 固定的套路,服务器7步,客户端5步。
2 服务器停在 accept(),直到有客户端连接。
3 服务器和客户端 要同时考虑。
UDP编程:
TCP 和 UDP 协议的区别
TCP 是 有连接协议,在客户端和服务器通信过程中,一直保持连接。数据交互以 数据流的方式(SOCK_STREAM)进行。可以重发一切错误数据。
UDP 是 无连接协议,在客户端和服务器通信过程中,不保持连接。数据交互以 数据报的方式(SOCK_DGRAM)进行。不会重发任何错误数据。
UDP效率较高,但不保证数据的完整和正确。
TCP效率低,但 保证数据的完整和正确。
UDP的发送和接收有特定的函数:
sendto() /recvfrom()
练习:
实现 客户端可以多次输入,并把输入发给服务器,输入bye退出。
服务端 多次接收数据,并把数据回发,用ctl+c退出。