精华内容
下载资源
问答
  • 试想下面一种应用场景,搭建一个文件传输的服务器和客户端,客户端从服务器处下载文件,当下载的文件完成时,客户端需要向服务器传递一个字符串,比如“ThankYou”。处理这种情况,再使用之前的close或
            之前在socket服务器和客户端中,在linux平台上一直使用close,windows平台使用closesocket断开连接,无论是close和closesocket,都是输入和输出的链接同时断开。试想下面一种应用场景,搭建一个文件传输的服务器和客户端,客户端从服务器处下载文件,当下载的文件完成时,客户端需要向服务器传递一个字符串,比如“ThankYou”。处理这种情况,再使用之前的close或者closesocket显示不合适,因为在服务器把文件全部传输完成之后,输入和输出连接全部断开,显然无法再收到客户端发送的字符串。此时我们就需要在文件传输后,能够优雅的断开服务器的输出连接,而保留输入连接,使用shutdown函数可以满足我们的需求。

    shutdown(socket sock,int flag);

            shutdown的两个参数:sock是需要断开连接的socket文件操作符,flag可选三个数值:

    SHUT_RD - 断开输入流
    SHUT_WR - 断开输出流
    SHUT_RDWR - 同时断开输出流和输入流

            下面的例子,利用socket创建了一个简单的文件传输服务器和客户端。服务器不断读取一个名叫file_server.c(就是服务端的代码所在文件)的文件,发给客户端,待读取完成后,接受客户端发过来的信息。服务端代码如下:

    file_server.c:

    #include<string.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<sys/socket.h>
    #include<stdio.h>
    #define BUF_SIZE 30
    
    void error_handling(char *message);
    
    int main(int argc,char * argv[])
    {
        int serv_sd,clnt_sd;
        FILE* fp;
        char buf[BUF_SIZE];
        int read_cnt;
    
        struct sockaddr_in serv_adr,clnt_adr;
        socklen_t clnt_adr_sz;
        
        if(argc!=2)
        {
            printf("Usage %s <port>",argv[0]);
            exit(1);
        }
    
        fp=fopen("file_server.c","rb");
        serv_sd=socket(AF_INET,SOCK_STREAM,0);
        
        memset(&serv_adr,0,sizeof(serv_adr));
        serv_adr.sin_family=AF_INET;
        serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
        serv_adr.sin_port=htons(atoi(argv[1]));
        
        bind(serv_sd,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
        listen(serv_sd,5);
        
        clnt_adr_sz=sizeof(clnt_adr);
        clnt_sd=accept(serv_sd,(struct sockaddr*)&clnt_adr,&clnt_adr_sz);
        while(1)
        {
            read_cnt=fread((void*)buf,1,BUF_SIZE,fp);
            if(read_cnt<BUF_SIZE)
            {
                write(clnt_sd,buf,read_cnt);
                break;
            }
            write(clnt_sd,buf,BUF_SIZE);
        }
        shutdown(clnt_sd,SHUT_WR);
        read(clnt_sd,buf,BUF_SIZE);
        printf("message from client: %s \n",buf);
    
    
        fclose(fp);
        close(serv_sd);
        close(clnt_sd);
        return 0;
    }
    
    
    void error_handling(char *message)
    {
        fputs(message,stderr);
        fputc('\n',stderr);
        exit(1);
    }
    

    客户端的代码比较简单,就是接受服务端的文件,接受完成后给服务端发送一个“Thank you”的字符串。

    file_clent.c:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<arpa/inet.h>
    #include<sys/socket.h>
    
    #define BUF_SIZE 30
    
    void error_handling(char *message);
    
    int main(int argc,char * argv[])
    {
        int serv_sock;
        FILE* fp;
        int read_cnt;
        char buf[BUF_SIZE];
    
        struct sockaddr_in serv_adr;
        if(argc!=3)
        {
            printf("Usage %s <addr> <port>",argv[0]);
            exit(1);
        }
        fp=fopen("recieve.dat","wb");
        serv_sock=socket(AF_INET,SOCK_STREAM,0);
    
        memset(&serv_adr,0,sizeof(serv_adr));
        serv_adr.sin_family=AF_INET;
        serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
        serv_adr.sin_port=htons(atoi(argv[2]));
    
        connect(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr));
        
        while((read_cnt=read(serv_sock,buf,BUF_SIZE))!=0)
        {
            fwrite((void*)buf,1,read_cnt,fp);
            printf("read_cnt= %d\n",read_cnt);
        }
    
        puts("recieved all data");
        write(serv_sock,"Thank you",10);
        fclose(fp);
        close(serv_sock);
    }
    
    
    void error_handling(char *message)
    {
        fputs(message,stderr);
        fputc('\n',stderr);
        exit(1);
    }
    
    
    

    运行结果如下:

    [Hyman@Hyman-PC csdn]$ ./serv 9190
    message from client: Thank you 


    [Hyman@Hyman-PC csdn]$ ./clnt 127.0.0.1 9190
    recieved all data


    Github位置:

    https://github.com/HymanLiuTS/NetDevelopment

    克隆本项目:

    git clone git@github.com:HymanLiuTS/NetDevelopment.git

    获取本文源代码:

    git checkout NL07


    展开全文
  • 2.2.3 字符串 23 2.3 重要的数据结构 23 2.3.1 驱动对象 23 2.3.2 设备对象 25 2.3.3 请求 26 2.4 函数调用 28 2.4.1 查阅帮助 28 2.4.2 帮助中有的几类函数 30 2.4.3 帮助中没有的函数 32 2.5 Windows的驱动开发...
  • 第4章 内核字符串与内存 4.1 字符串的处理 4.1.1 使用字符串结构 4 1 2 字符串的初始化 4.1.3 字符串的拷贝 4.1.4 字符串的连接 4.1.5 字符串的打印 4 2 内存与链表 4 2.1 内存的分配与释放 4.2.2 使用LIST_ENTRY ...
  • 该站点包含JS代码,该代码生成无限的字符串,使内存不堪重负。 打开无限数量的命令提示符窗口,直到系统崩溃为止。 在浏览器中打开许多窗口并压碎PC。 叉子炸弹会创建大量子进程,直到计算机放弃运行为止。 ...
  • 方法:打开注册表regedit,展开HKEY—CLASS—ROOT,然后找想要创建的图片的后缀名的注册表项(.bmp、.jpg、.jpeg等)找到后,在相应的项下面新建子项为ShellNew,创建后,再该子项的右边新建一个“字符串值”名为...
          适用于windows任何版本的操作系统,包括win7、2008等。方法:打开注册表regedit,展开HKEY—CLASS—ROOT,然后找想要创建的图片的后缀名的注册表项(.bmp、.jpg、.jpeg等)找到后,在相应的项下面新建子项为ShellNew,创建后,再该子项的右边新建一个“字符串值”名为NullFile,完成后点击上方的“查看”-“刷新”后关闭注册表,在桌面“右键新建”选项里就已经出现了对应的图片创建了.
    
    展开全文
  •  6.1.8 ANSI_STRING字符串与UNICODE_STRING字符串相互转换  6.2 内核模式下的文件操作  6.2.1 文件的创建  6.2.2 文件的打开  6.2.3 获取或修改文件属性  6.2.4 文件的写操作  6.2.5 文件的读操作  ...
  • 2.2.3 字符串 20 2.3 重要的数据结构 21 2.3.1 驱动对象 21 2.3.2 设备对象 22 2.3.3 请求 24 2.4 函数调用 25 2.4.1 查阅帮助 25 2.4.2 帮助中有的几类函数 26 2.4.3 帮助中没有的函数 28 2.5 Windows的...
  • 面图标也越大),然后单击“确定”关闭“编辑字符串”对话框。当你注销当 前用户并重新启动计算机后设置就生效。  10、如何对系统声音进行选择与设置  系统声音的选择与设置就是为系统中的事件设置声音,当...
  • Windows设备驱动程序WDF开发源码

    千次下载 热门讨论 2009-05-26 15:21:24
    3.8.1 字符串格式 3.8.2 WDFSTRING对象 3.8.3 串处理函数 3.9 QueueSample实例 第4章 KMDF驱动程序编程入门 4.1 建立KMDF编程环境 4.2 创建KMDF驱动程序 4.3 生成KMDF驱动程序 4.4 安装KMDF驱动程序 4.5 RegSample...
  • 2.2.3 字符串 20 2.3 重要的数据结构 21 2.3.1 驱动对象 21 2.3.2 设备对象 22 2.3.3 请求 24 2.4 函数调用 25 2.4.1 查阅帮助 25 2.4.2 帮助中有的几类函数 26 2.4.3 帮助中没有的函数 28 2.5 Windows的...
  • windows蓝屏错误代码

    2010-11-18 22:27:50
    160 0×000000A0 传到 DosExecPgm 的自变量字符串不正确。 161 0×000000A1 指定的路径不正确。 162 0×000000A2 信号等候处理。 164 0×000000A4 系统无法建立执行绪。 167 0×000000A7 无法锁定档案的部份范围。 ...
  • 2.5.3 Windows字符串函数 2.6 为何要用Unicode 2.7 推荐的字符和字符串处理方式 2.8 Unicode与ANSI字符串转换 2.8.1 导出ANSI和Unicode DLL函数 2.8.2 判断文本是ANSI还是Unicode 第3章 内核对象 3.1 何为内核对象 ...
  • 2.2.3 字符串 23 2.3 重要的数据结构 23 2.3.1 驱动对象 23 2.3.2 设备对象 25 2.3.3 请求 26 2.4 函数调用 28 2.4.1 查阅帮助 28 2.4.2 帮助中有的几类函数 30 2.4.3 帮助中没有的函数 32 2.5 Windows的驱动开发...
  • Windows Server 2008系统内置功能强大的命令,可在命令行模式下完成所有可在Windows界面下执行的操作,尤其在执行脚本、批处理等操作时,更加方便快捷. 以实践为主,突出实用性、针对性和技术性.. 列举大量实例,...
  • Windows Server 2008系统内置功能强大的命令,可在命令行模式下完成所有可在Windows界面下执行的操作,尤其在执行脚本、批处理等操作时,更加方便快捷. 以实践为主,突出实用性、针对性和技术性.. 列举大量实例,...
  • WINDGB环境配置

    2016-01-20 16:38:24
     造成这个问题的原因主要是因为Windows 7为了避免不必要的系统开销而默认关闭了调试信息过滤,因此导致我们无法正常打印出调试字符串。开启的方法非常简单,我们只需要操作注册表就可以建立一个调试打印过滤器,将...
    解决Windows 7下编写驱动时DbgPrint / KDPrint不能打印的问题
           造成这个问题的原因主要是因为Windows 7为了避免不必要的系统开销而默认关闭了调试信息过滤,因此导致我们无法正常打印出调试字符串。开启的方法非常简单,我们只需要操作注册表就可以建立一个调试打印过滤器,将以下内容保存为*.reg文件后,双击执行后即可完成设置工作。
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
    "DEFAULT"=dword:0000000f

    解决WinDBG符号(Symbol)加载不正常的情况
           我们都知道WinDBG在使用之前需要配置Symbol信息,这样你在查看系统结构时,会得到非常详尽的信息,我们一般情况下会这样配置。
    1. 运行WinDBG后,按快捷键【Ctrl】+【S】调出符号信息配置对话框(或依次点击菜单栏上的“File”>“Symbol File Path...”);
    2. 输入如下配置信息:C:\Symbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols  ;
           至此我们已经完成了对WinDBG的符号配置问题,但是有时我们这样配置完成后由于某种原因并未生效,如果你遇到这样的问题,那么你或许可以试试如下方法。
    1. 输入命令设置WinDBG符号;

    kd>.sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

    2. 用!sym noisy命令使得WinDBG在获得符号的时候取得更多的信息,然后使用!lmi命令让WinDBG查看Windows的ntoskrnl模块,最后然后使用.reload /f尝试获取ntoskrnl的符号。
    kd>!sym noisy
    kd>!lmi
    kd>.reload /f
     [注意:以上的“kd>”是提示符,不要将其误当成命令中的一部分]
            现在,你可以尝试输入一下例如“dt _teb”等命令查看是否成功了。
            如果仍然不成功,你可以检查一下你是否安装了Symbol,如果安装了,则检查一下Symbol的版本是否正确(与当前操作系统版本比对),如果版本不正确,请卸载此Symbol,并重新安装正确版本的Symbol,或干脆不安装。

    展开全文
  • Python基础教程 第二版

    2018-04-04 12:35:58
    1.11.5 长字符串、原始字符串和Unicode 1.12 小结 1.12.1 本章的新函数 1.12.2 接下来学什么 第2章 列表和元组 2.1 序列概览 2.2 通用序列操作 2.2.1 索引 2.2.2 分片 2.2.3 序列相加 2.2.4.乘法 2.2.5 成员资格 ...
  • Apgache Common

    2016-09-07 22:21:43
    > 文件部分作用 Apgache Common IO 1、解决linux和windows的文件系统命名问题; 2、提供文件操作(移动,读取,检查存在等)...7、输入流自动完成输出流并关闭的操作;输入流 其他部分 BCEL 字节码工程开发库:分析

    >

    1. 文件部分作用
      Apgache Common IO
      1、解决linux和windows的文件系统命名问题;
      2、提供文件操作(移动,读取,检查存在等);
      3、字符串操作及比较的方法;
      4、文件监控器(文件插删改时触发的事件)
      5、过滤器:选择某范围或精确一点的文件
      6、文件不同方式的排序
      7、输入流自动完成输出流并关闭的操作;输入流
    2. 其他部分

    BCEL 字节码工程开发库:分析、创建和操作Java class文件。 5.2 2007-06-14
    BeanUtils 对Java反射和自检(introspection)API的包装,让使用变得更加容易。 1.9.2 2014-05-29
    BSF Bean脚本框架:包括JSR-233的脚本语言框架。 3.1 2010-24-06
    Chain 责任链模式实现。 1.2 2008-06-02
    CLI 命令行参数解析器。 1.3.1 2015-06-17
    Codec 通用编解码算法(例如phonetic、base64、URL)。 1.10 2014-11-09
    Collections Java Collection框架扩展和增强。 4.0 2013-11-24
    Compress 支持tar、zip和bzip2文件操作的API。 1.10 2015-08-18
    Configuration 从各种格式中读取各种配置、首选项。 2.0-beta1 2015-06-19
    CSV 读写用逗号分隔数值的组件。 1.2 2015-08-24
    Daemon 一种可选机制方式,用来调用Java编写的类unix后台程序。 1.0.15 2013-03-04
    DBCP 数据库连接池服务。 2.0.1 2014-05-24
    DbUtils JDBC帮助函数库。 1.6 2014-07-20
    Digester 映射XML到Java对象的工具。 3.2 2011-12-13
    Discovery 通过服务、引用映射到资源名称来定位资源的工具。 0.5 2011-04-28
    EL JSP 2.0规范定义的表达式语言解析器。 1.0 2003-06-18
    Email 使用Java发送email。 1.4 2015-05-23
    Exec 使用Java处理外部流程执行和环境管理的API。 1.3 2014-11-06
    FileUpload 为Servlet和Web应用程序提供文件上传功能。 1.3.1 2014-02-07
    Functor Functor(函子)是一个函数,可以当做对象或者代表独立泛型函数的对象。 N/A N/A
    Imaging (previously called Sanselan) 纯Java编写的图形函数库。 N/A N/A
    IO I/O工具集合。 2.4 2012-06-12
    JCI Java编译器接口。 1.1 2013-10-14
    JCS Java缓存系统。 1.3 2007-06-05
    Jelly 基于XML的脚本和处理引擎。 1.0 2005-06-16
    Jexl JSTL表达式语言的扩展。 2.1.1 2011-12-24
    JXPath 使用XPath语法操作Java Bean的工具。 1.3 2008-08-14
    Lang 为java.lang中的类提供附加功能。 3.4 2015-04-06
    Launcher 跨平台Java应用程序启动器。 1.1 2004-08-22
    Logging 对各种日志API实现的封装。 1.2 2014-07-11
    Math 轻量级、字包含数学和统计组件。 3.5 2015-04-17
    Modeler 创建兼容JMX规范的Model MBean机制。 2.0.1 2007-06-25
    Net 网络工具集合及协议实现。 3.3 2013-06-12
    OGNL 一种对象—图形导航语言。 N/A N/A
    Pool 通用对象池组件。 2.4.1 2015-05-30
    Primitives 支持Java基础类型的小巧、快速、简单实现。 1.0 2003-11-05
    Proxy 创建动态代理的支持库。 1.0 2008-02-28
    SCXML 旨在创建和维护Java SCXML引擎的状态图XML规范实现。可以通过SCXML文档定义状态机并抽象环境接口。 0.9 2008-12-01
    Validator 通过xml文件定义验证器和验证规则的框架。 1.4.1 2014-01-13
    VFS 用来处理文件、FTP、SMB、ZIP和类型单逻辑文件系统的虚拟文件。 2.0 2011-08-24
    Weaver 提供了一种简单的方式增强(织入 weave)编译后的字节码。 1.1 2014-09-30

    展开全文
  • 54 理解字符串作为char类型的数组 55 代码注释 第五章 文件——基本类型 56 Visual C++IDE使用的文件类型 57 理解文本文件和文档文件 58 创建并使用源文件 59 创建并使用头文件 60 使用保护:避免头文件多次被包含 ...
  • 54 理解字符串作为char类型的数组 55 代码注释 第五章 文件——基本类型 56 Visual C++IDE使用的文件类型 57 理解文本文件和文档文件 58 创建并使用源文件 59 创建并使用头文件 60 使用保护:避免头文件多次被包含 ...
  • 54 理解字符串作为char类型的数组 55 代码注释 第五章 文件——基本类型 56 Visual C++IDE使用的文件类型 57 理解文本文件和文档文件 58 创建并使用源文件 59 创建并使用头文件 60 使用保护:避免头文件多次被包含 ...
  • 54 理解字符串作为char类型的数组 55 代码注释 第五章 文件——基本类型 56 Visual C++IDE使用的文件类型 57 理解文本文件和文档文件 58 创建并使用源文件 59 创建并使用头文件 60 使用保护:避免头文件多次被包含 ...
  • 1.11.5 长字符串、原始字符串和Unicode 1.12 小结 1.12.1 本章的新函数 1.12.2 接下来学什么 第2章 列表和元组 2.1 序列概览 2.2 通用序列操作 2.2.1 索引 2.2.2 分片 2.2.3 序列相加 2.2.4 乘法 2.2.5 成员资格 ...
  • 实例133 把整型数据格式化为指定长度的字符串 实例134 将长整型的数字分位显示 实例135 过滤输入字符串中的危险字符 实例136 过滤字符串中的空格与NULL值 实例137 获得汉字的拼音简码 5.2 数据验证 实例138 ...
  • 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的所有空格 实例082 汉字与区位码的转换 第5章 面向对象技术应用 5.1 ...
  • 实例078 从字符串中分离文件路径、文件名及扩展名 实例079 判断手机号的合法性 实例080 用字符串构建器追加字符 实例081 去掉字符串中的所有空格 实例082 汉字与区位码的转换 第5章 面向对象技术应用 5.1 ...
  • 细分为<用数字顺序或倒序><用EXCEL存储格内容><增加字符串><清除字符串><替换字符串>多方式改名,优点明显。例:替换字符串就支持起始长度、替换个数、GB2与BIG5码相互转换等多选项操作,也支持文件扩展名的修改。现...
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    4.5.1 查找以空字符结尾的字符串的长度 169 4.5.2 连接以空字符结尾的字符串 170 4.5.3 复制以空字符结尾的字符串 171 4.5.4 比较以空字符结尾的字符串 172 4.5.5 搜索以空字符结尾的字符串 173 4.6 C++/CLI...
  • 4.5.1 查找以空字符结尾的字符串的长度 169 4.5.2 连接以空字符结尾的字符串 170 4.5.3 复制以空字符结尾的字符串 171 4.5.4 比较以空字符结尾的字符串 172 4.5.5 搜索以空字符结尾的字符串 173 4.6 C++/CLI...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 133
精华内容 53
关键字:

windows7关闭完成字符串