UDP 通信模型服务器端及TCP编程 C/S模型

udp编程  c/s模型 
  客户端
  socket 
  sendto 
  ...
  
  服务器端          ---把自己的地址公布出去 
  socket  
  bind             //绑定 
  recvfrom      //接收数据
  ...

函数  bind 

int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联,  用于从该接口接受数据。

          如果该函数在客户端调用,则表示要将数据从 参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。

注意:  如果是客户端,则该函数可以省略,由默认接口发送数据。
参数:
      sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构 --- ip + 端口 
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

       addrlen  表示addr地址结构大小
#注意:30行的IP为运行该服务器的虚拟机的IP地址      

函数recvfrom          从套接字接收信息

ssize_t recvfrom( int sockfd,    //socket的fd
                             void *buf,    //保存数据的一块空间的地址 
                            size_t len,    //这块空间的大小 
                               int flags,    // 0  默认的接收方式 --- 阻塞方式 
   struct sockaddr *src_addr,    //用来保存发送方的地址信息 
            socklen_t *addrlen );    //表示发送方实际的地址信息大小

返回值: 成功 返回接收到的字节数 ,  失败  -1 

服务器从客户端接收信息


客户端的ip和端口号post保存在srcaddr结构体中

打印IP时函数 inet_ntoa 表示网络转主机IP点分十进制用字符串表示

打印post时 函数 ntohs 表示网络到主机转字节序

当服务器接收信息不关心发送方地址时第五第六个参数可传NULL

如:recvfrom(fd,buf,sizeof(buf),0,NULL,NULL)

客户端 从键盘获得数据 发给服务器 服务器打印并回发 

客户端:

服务器:

TCP C/S模型

面向链接

TCP客户端

1.建立连接
socket        
bind           //可选    
connect     //链接 
....
2.通信过程 
read 
write 
close 
TCP服务器:
1.建立连接 
socket  
bind   
listen     //监听 客户端的连接请求 
accept   //接听 ---这一步完成之后 连接就建立好了,之后就可以收发数据  
..... 
//2.通信过程 
read 
write 
close

函数 connect
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
         addrlen: 参数2的长度。
返回值:成功 0 ,失败 -1;

函数  listen


 listen 函数用于使服务器套接字进入监听状态,以等待客户端的连接请求

int listen(int sockfd, int backlog);

s: 要监听的套接字描述符,通常是通过 socket 和 bind 创建的服务器套接字。

backlog: 定义了服务器套接字可以排队等待的连接请求数目。这个参数告诉操作系统在连接队列中最多可以容纳多少个等待处理的连接。如果队列已满,新的连接请求将会被拒绝。

成功调用 listen 后,服务器套接字就进入了监听状态,等待客户端的连接。这时,你可以使用 accept 函数来接受客户端的连接请求。通常在调用 listen 之后,会有一个循环,不断地调用 accept 来处理客户端连接。

accept 函数在服务器端等待客户端的连接请求。当客户端连接请求到达时,accept 函数会创建一个新的套接字,并返回一个新的套接字描述符,该描述符与客户端的套接字建立连接

int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

socket:服务器创建的监听套接字,用于接受客户端的连接请求。

address:一个指向 struct sockaddr 的指针,用于存储客户端的地址信息。可以设置为 NULL,表示不关心客户端的地址信息。

address_len:一个指向 socklen_t 类型的指针,表示 address 缓冲区的长度。

返回值 : 如果连接成功,返回一个新的套接字描述符,用于与客户端通信。

如果失败,返回 -1,并设置 errno 来指示错误的类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值