TCP客户端的搭建流程:

1.创建套接字  socket

2.要指定服务器的ip和端口、协议等

绑定ip 和端口号  bind(可以不绑定)

3.连接服务器 connect

4.通信

  1. read、write
  2. Recv、send
  3. Recvfrom、sendto

5.关闭套接字:close/shutdown(套接字,howto):howto:0(读端) 1(写端)

出现问题如何优化:

1、

  1. 设置套接字重用:setsockopt()

    1. Int opt = 1;
    2. Setsockopt(套接字,SOL_SOCKET,  SO_REUSEADDR, &opt, sizeof(opt) );
  2. 打印客户端ip和端口
    1. 需要创建新的结构体变量保存 客户端的ip等信息
    2. Eg:
      • struct sockaddr_in caddr ={0};
      • int len = sizeof(caddr);
      • Accept(listenfd, (struct sockaddr *)caddr,  &len);
      • Printf(“ip:%s--port:%d\n”, inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port));

代码如下:

#include <stdio.h>
#include <string.h>

 #include <sys/types.h>          /* See NOTES */  //man  socket
 #include <sys/socket.h>

 #include <sys/socket.h>    //  man 7 ip
 #include <netinet/in.h>
 #include <netinet/ip.h> /* superset of previous */

#include <sys/socket.h>  //man 3 inet_addr  
#include <netinet/in.h>
#include <arpa/inet.h>  //man 2 read 
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>

#define SIZE 1024
#define SERV_IP "0"
#define SERV_PORT 6666

int main(int argc,const char *argv[])
{
    int listenfd;  //用于保存监听套结字
    int connfd  ; //用于通信的套结字
    int ret; 
    char recvbuf[SIZE] = {0}; 

    //1、创建套结字 socket 
    listenfd = socket(AF_INET, SOCK_STREAM, 0); //AF_INET:IPV4协议  SOCK_STREAM:流式套结字
    if(-1 == listenfd)
    {
        perror("socket");
        return -1;
    }
    printf("socket %d ok\n", listenfd); //
    //填充ip等信息到通用ip结构体
    #if 0
    struct sockaddr_in saddr ;
    memset(&saddr, 0, sizeof(saddr)); // bzero(&saddr, sizeof(saddr));
    saddr.sin_family     = AF_INET;   //IPV4 协议
    saddr.sin_port       =  htons(6666);//端口号 :1024-49151
    saddr.sin_addr.s_addr=   inet_addr("192.168.16.100"); 
    #else
    struct sockaddr_in saddr = { 
        .sin_family = AF_INET, 
        .sin_port = htons(SERV_PORT), 
        .sin_addr.s_addr = inet_addr(SERV_IP)   
    }; 
    #endif
    //优化2:设置套结字属性  端口重用  setsockopt(); 
    int opt = 1; 
    setsockopt(listenfd, SOL_SOCKET,  SO_REUSEADDR, &opt, sizeof(opt)); 
    //2、绑定ip和端口a
    socklen_t  slen = sizeof(saddr); 
    ret =  bind(listenfd,  (struct sockaddr* )&saddr, slen); 
    if(-1 == ret)
    {
        perror("bind");
        return -1;
    }
    printf("bind ok\n");
    //3、监听
    ret = listen(listenfd, 8); 
    if(-1 == ret)
    {
        perror("listen");
        return -1;
    }
    printf("listen ok, wait for connect...\n");

    //优化1:循环监听客户端 
    while(1)
    {
        //4、处理客户端请求
    #if 0
        //accept之后 监听套结字listenfd  转接 为新的 通信套结字 connfd 使用
            connfd = accept(listenfd, NULL, NULL); //不关心客户端的ip和端口
            printf("had   client connect%d\n", connfd); 
    #else
        //优化 3:关心客户端ip和端口了并打印
        struct sockaddr_in caddr = {0};
       // memset(caddr, 0, sizeof(caddr)); 
        socklen_t clen = sizeof(caddr); 
        connfd = accept(listenfd, (struct sockaddr *)&caddr, &clen); 
        if(connfd == -1)
        {
            perror("accept");
            return -1;
        }

        printf("client(%s:%d) had connected success\n", inet_ntoa(caddr.sin_addr), ntohs(caddr.sin_port) );  

    #endif 
        //5、通信
        while(1)
        {
            memset(recvbuf, 0, sizeof(recvbuf));
            int count = read(connfd, recvbuf, sizeof(recvbuf));
            if(-1 == count)
            {
                perror("read");
                return -1;
            }
            else if(0 == count)
            {
                printf("client quit\n");
                break; 
            }
            printf("recv:%s\n",recvbuf); 

            //判断客户端发来的指令  做出响应
            if( 0 == strncmp(recvbuf, "sl", 2) )
            {
                system("sl");
            }
            else if(0 == strncmp(recvbuf, "xcowsay", 7))
            {
                system("xcowsay   爱 老虎油!");
            }
            //

            int i;
            for(i=0; i<count; i++)
            {
                recvbuf[i] =  toupper(recvbuf[i]);  //将单个字符转化大写
            }

            //write(connfd, "ok", 2);
            write(connfd, recvbuf, count); 
        }
        //6、关闭套结字退出
        close(connfd);
    }
close(listenfd);
return 0;
}

网络编程:TCP客户端的搭建流程(附源码)相关推荐

  1. C#编程总结(七)数据加密——附源码

    C#编程总结(七)数据加密--附源码 概述 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之 ...

  2. 生成对抗网络(GANs)的资料小结,另附:资源|17类对抗网络经典论文及开源代码(附源码)

    1.GANs的一些资料链接 ************************************************** *********************************** ...

  3. Android一行代码实现网络加载GIF闪图(附源码)

    最近项目有个需求是要从网络加载GIF闪图, 但是Android原生的ImageView并不支持Gif... 于是从网上看了些Dome, 发现总是有些这样那样的问题, 譬如: ☹ 没有缓存,还要自己写一 ...

  4. java基础—网络编程——TCP客户端与服务端交互

    import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import ja ...

  5. java网络编程TCP传输—流操作—拿到源后的写入动作

    在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 1 //获取sock ...

  6. ESP8266安卓TCP客户端开发(含全部源码)

    ESP8266安卓TCP客户端开发 最近在玩8266模块,想让它在局域网控制下开关,所以就搞开发一个安卓客户端调试的工具 直接上步骤: 第一步新建一个空白的Activity 工程名字自己可以改 第二先 ...

  7. 最新版的SSM框架spring5.0搭建教程(附源码)

    <p>用SSM框架已经有一段时间了,但都没有完整地搭建过一次工程.前段时间比较有时间就自己试着搭建了一下,差不多都是用的最新的spring版本了,然后就在这个基础上做了很多的实验测试.最近 ...

  8. 培训机构管理系统的搭建,附源码,适合SSM入门,随便看看,解决数据库驱动,连接url时区等等问题

    文章目录 1.主要使用的技术栈 2.源码地址 3.部署须知 4.可能会遇到的问题 5.程序主要页面展示 管理员界面 普通讲师账号 普通用户有两个页面有瑕疵,不想改了,就这样吧,拿去随便玩玩. 总览整个 ...

  9. wordpress网站同步微信小程序源码搭建(附源码,亲测)

    前置条件 1.已完成wordpress网站搭建 2.已在wordpress后台安装小程序插件 搜索插件:REST API TO MiniProgram,进行安装启用,根据配置文档进行配置 3.已在小程 ...

  10. 房产管理系统的安装和搭建(附源码)

    更新房产中介管理ERP系统安装,希望能帮到到家.因为安装后非常好用,也非常省事,不仅包含了源代码,还有移动端平台.可以让自己自由掌控系统,在用户数量和使用时限以及功能上都不会受到任何限制.(源码就是系 ...

最新文章

  1. 快起床刷题去,别人把你offer拿走啦
  2. SqlServer英文单词全字匹配
  3. 基于Springboot实现仿百度网盘开发
  4. Eclipse 常用最新插件.标记
  5. php校园开源,基于 Laravel 5.5 开发的开源校园管理系统 —— Unifiedtransform
  6. python读取字典元素笔记_python学习笔记:字典的使用示例详解
  7. IDEA无法通过类加载器获取resources文件夹配置文件解决办法
  8. 我凭什么拿到了阿里、腾讯、今日头条3家大厂offer?这原因我服了
  9. 装箱与拆箱 c# 1231
  10. 人民用不起的共享充电宝,可能还被植入了木马,这三类要慎用!
  11. python df共有几行_从zero到hero,一款Python自然语言处理效率利器!
  12. php调用lstat频繁,PHP lstat()函数使用方法
  13. 浅谈C#值类型和引用类型
  14. 机器学习技法2-Dual Support Vector Machine
  15. 测试一段C代码的执行时间(windows系统和ubuntu系统)
  16. 医疗卫生行业中的领域模型
  17. 52好压卸载不干净,解压时仍有52好压选项【彻底删除步骤,超详细】
  18. WIFI智能插座Homekit
  19. c语言str系列函数
  20. 求安慰,找java工作两个多月了

热门文章

  1. 投票 java_java实现投票程序设计
  2. All-Pay Contests(博弈论+机制设计) 论文阅读笔记
  3. 求最大公约数与最小公倍数算法——Java
  4. win7计算机如何设置密码,电脑win7怎么设置开机密码
  5. 外卖行业现状分析_2019年我国餐饮外卖行业发展现状及前景分析
  6. 发一款资源查看,编辑软件,可以编辑dll,exe,res等后缀名的文件的小东东(Reshacker汉化版)
  7. matlab从无到有系列(八):M文件及函数的编写
  8. 实用的网页模板(一)
  9. 华硕笔记本的 Ubuntu 18.04 安装 nvidia 显卡驱动并支持 HDMI 输出
  10. 【sketchup 2021】草图大师图像输出与渲染之Enscape渲染(优秀的实时渲染软件)的高级使用【灯光的添加、代理模型的添加、材质编辑器、视频编辑器、全景导出并编辑】