33,UC(12)

来源:互联网 发布:长虹b2b软件下载 编辑:程序博客网 时间:2024/05/03 18:18

回顾:
  信号量集 - 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退出。

 

原创粉丝点击