嵌入式开发之TCP网络编程(三)

目录

服务器并发编程实战 

1、优化1:让服务器程序能绑定在任意的IP上

2、优化2:获取程序刚建链接的socket的客户端的IP地址和端口号

3、优化3:用多进程/多线程处理已经建立好连接的客户端数据

4、思考:

5、socket 服务端退出不能立马启动

6、多线程改造成多进程


嵌入是开发 之TCP网络编程(二)

服务器并发编程实战 

1、优化1:让服务器程序能绑定在任意的IP上

INADDR\_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
htonl(INADDY_ANY) //INADDY_ANY: -1

    1、优化1:让服务器程序能绑定在任意的IP上
#if 1  //让 else 的代码失效
    sin.sin_addr.s_addr = htonl(INADDY_ANY);  // INADDY_ANY: -1补码存储32位全是1,
#else

可以让服务器可以绑定到任意的机器上,没有强行绑定到哪个IP上任意网卡,只要满足网络类型(TCP)+ 端口。就行

linux 虚拟一个网卡:

sudo inconfig eth0:0 13x.xx7.4xx.8xx

2、优化2:获取程序刚建链接的socket的客户端的IP地址和端口号

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

如果想取到哪个客户端调用,客户端会填充ip地址和端口号

inet_ntop(int af,const void *src,char *dst,socklen_t size):把IPV4/IPV6的网络字节序的地址变成本地的字符串形式的IP地址

特点:适应于IPV4和IPV6、能正确处理-1的转换问题

参数:af:地址协议簇(AF_INET或AF_INET6)

           src: 是一个指针(32位网络字节序的IP地址)

           dst:输出结果为点分形式的IP地址【主要指IPV4】

返回值:

    成功返回非空指针,失败:空指针

   struct sockaddr_in cin;
   addrlen = sizeof(cin);
   if(newfd = accept(fd,(struct sockaddr *)&cin,&addrlen) < 0){
      perror("accept");
      exit(1);
  }
  //拿到网络字节序,显示串口或点分本地字节序
  char ipv4_addr[16]; //xxx.xxx.xxx.xxx + '\0',其中xxx. 占4个字节 3*4+3+1 = 16
  if(!inet_ntop(AF_INET,(void *)&cin.sin_addr.s_addr,ipv4_addr,sizeof(cin))){
      perror("inet_ntop");
      exit(1);
  }

  printf("Clinet(%s:%d) is connected!",ipv4_addr,ntons(cin.sin_port));

3、优化3:用多进程/多线程处理已经建立好连接的客户端数据

    pthread_t tid;
    struct sockaddr_in cin;
    addrlen = sizeof(cin);
   while(1){
    if(newfd = accept(fd,(struct sockaddr *)&cin,&addrlen) < 0){
       perror("accept");
       exit(1);
    }
     //拿到网络字节序,显示串口或点分本地字节序
     char ipv4_addr[16]; //xxx.xxx.xxx.xxx + '\0',其中xxx. 占4个字节 3*4+3+1 = 16
    if(!inet_ntop(AF_INET,(void *)&cin.sin_addr.s_addr,ipv4_addr,sizeof(cin)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三日沐水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值