Day34_TCP、UDP网络编程

网络编程:
  网络编程需要使用通信地址 sockaddr_in ,其中的端口和IP都要做转换,端口要从本机格式转网络格式,IP要从点分十进制转十六进制。函数:
  htons() - 本机 转 网络(端口)
  inet_addr() - 点分十进制 转 十六进制 (IP)
 
  TCP网络编程步骤:
   一对多(也实现一对一):
    服务器端:
     1.创建socket描述符 socket()
     2.准备通信地址,用sockaddr_in
     3.绑定bind(),开放权限
     4.监听客户端的连接listen()
     5.等待客户端的连接accept(),返回一个新的socket描述符,用于与客户端的交互
     6.read() write() 读写数据
     7.close()
     客户端的代码步骤不变
  listen(int sockfd,int backlog)
   参数 sockfd 就是第一步的返回值
     backlog就是当正在处理客户端连接时,有新的客户端连接,会把新的请求放入队列,backlog就是 这个队列的最大长度。而如果处理完毕,从队列中拿出新的请求,队列就会变短
     
  int accept(int sockfd,struct sockaddr* addr,socklen_t* len)
     参数 sockfd 就是第一步的返回值
          addr 用于存储 客户端的IP
          len 是传入传出参数,传入addr的大小,传出真实的大小
  注:使用TCP编程时,socket()中的type必须用:SOCK_STREAM
      accpet()函数会阻塞,直到有客户端连接才能解除。
      信息交互时,服务器和客户端一定要保持读写的一致性。一个读,另外一个必须写。
      用 ping IP地址 可以查看网络是否畅通
 
   int reuseaddr =1;//避免重启时 地址被占用 错误
   setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,s    izeof(reuseaddr));
   
   memset(buf,0,sizeof(buf));//字符串清0
   
   TCP和UDP
   TCP是 有连接协议(基于连接的协议),想要数据交互必须保持连接,会给服务器带来很大的压力。好处就是 可以重发一切错误数据,因此TCP的数据一定是正确和完整的。
   UDP是 无连接协议,平时不保持任何的连接,服务器压力较小。缺点就是不会主动重发错误数据,因此有可能丢失数据。UDP也可以用connect()进行连接。
   
   UDP编程:(socket(SOCK_DGRAM)就是UDP)
   编程步骤:
    1 创建socket(),type必须 SOCK_DGRAM
    2 准备通信地址
    3 如果Server,绑定bind,客户端什么都不用做。
    4 使用 sendto()和recvfrom() 交互数据。
    5 关闭socket。 close()
   注:如果不想 拿发送方的通信地址,read()也可以接收。
   int sendto(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t size)
    前3个参数与write()一样,flags置0,后两个参数存储接收方的通信地址和地址长度。
  成功返回 发送的字节数,失败 返回 -1.
   ssize_t recvfrom(int sockfd,void* buf,size_t len,int flags,struct sockaddr* addr,socklen_t* size)
   前3个参数与read()一样,flags置0,后两个参数存发送方的通信地址和地址长度指针。
   size 是 一个传入传出参数。
   返回实际接收到的字节数,失败 -1.

  作业:
    用UDP实现一个时间服务器。时间服务器就是取自己的系统时间,返回给客户端。
    客户端先发请求(比如hello),服务器端返回当前系统时间,客户端再显示(年月日小时分秒格式)。
   注:服务器端 要是一个 死循环,用信号退出
    转换日期格式用:
     秒差 time_t  函数time()获取
     年月日小时分秒格式的时间 - struct tm
     转换函数 - localtime()
   
   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值