精华内容
下载资源
问答
  • python socket.recv() 一直不停的返回空字符串原因。 我遇到的是,因为客户端异常断开连接,之后服务端就一直接收到空字符串。 这样会无法分辨是客户端真的了一个空串还是怎么样。 下面是复现问题的demo。 先...

    python socket.recv() 一直不停的返回空字符串原因。

    我遇到的是,因为客户端异常断开连接,之后服务端就一直接收到空字符串。

    这样会无法分辨是客户端真的发了一个空串还是怎么样。

    下面是复现问题的demo。

    先运行server端:

    # coding=utf-8
    import socket
    if __name__ == '__main__':
        host = 'localhost'
        port = 8765
    
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind((host, port))
        server.listen(1)  # 连接数
        client, address = server.accept()
        while True:  # 循环收发数据包
            data = client.recv(1024)
            print ("data:"+data)
    
    

    再运行client端:

    # coding=utf-8
    import socket
    import time
    
    if __name__ == '__main__':
        host = 'localhost'
        port = 8765
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)  # 在客户端开启心跳维护
    
        while True:
            client.connect((host, port))  # ###注意这里,会报错导致代码崩溃,这时候去看服务端输出,就可以看到无限就收空串
            client.send('hello world\r\n'.encode())
            print('send data')
    

    最终运行结果:

    客户端结果:
    
    
    send data
    Traceback (most recent call last):
      File "C:/Users/Rorschach/Desktop/test/test2.py", line 17, in <module>
        client.connect((host, port))  # ###注意这里,会报错导致代码崩溃,这时候去看服务端输出,就可以看到无限就收空串
      File "C:\Python27\Lib\socket.py", line 228, in meth
        return getattr(self._sock,name)(*args)
    socket.error: [Errno 10056] A connect request was made on an already connected socket
    
    
    服务端结果:
    
    
    C:\Users\Rorschach\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/Rorschach/Desktop/test/test1.py
    data:hello world
    
    hello world
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:
    
    data:

    参考:https://blog.csdn.net/bbg221/article/details/78464051

    侵删

    展开全文
  • //已信息数量 wchar_t MemName[512]; //会员名称 int state; //客户请求的状态 int MemType; //会员等级 SOCKET serConn; //服务器accpet链接客户端的套接字 }Cinfo; 服务端代码: Cinfo t_...
  • //查看客户端是否来消息,并快速返回 BOOL SOCKERT_Select(SOCKET Socket, int TimeOut, BOOL bRead) { fd_set fdset; //通知执行了select()的进程哪一socket或文件发生了可读或可写事件 //long类型的...
  • (2)、可设置每秒最大的连接并发量和连接(连接不数据)超时时间以防止DOS攻击造成的服务瘫痪、具有心跳处理(防网络异常造成的虚连接)功能 (3)、不加协议的透明传输,可适用广泛的网络通讯环境 (4)、可现实主...
  • SIGPIPE信号

    2020-12-14 10:30:53
    对一个已经收到 FIN 包的 socket 调用 read 方法,如果接收缓冲已,则返回 0,这就是常说的“连接关闭”表示。 对一个已经收到 FIN 包的 socket 第一次调用 write 方法时,如果发送缓冲没问题,则 write 调用会...

    产生 SIGPIPE 的条件

    对一个已经收到 FIN 包的 socket 调用 read 方法,如果接收缓冲已空,则返回 0,这就是常说的“连接关闭”表示。

    对一个已经收到 FIN 包的 socket 第一次调用 write 方法时,如果发送缓冲没问题,则 write 调用会返回写入的数据量,同时进行数据发送。但是发送出去的报文会导致对端发回 RST 报文。因为对端的 socket 已经调用了 close 进行了完全关闭,已经处于既不发送,也不接收数据的状态。所以第二次调用 write 方法时(假设在收到 RST 之后)会生成 SIGPIPE 信号,导致进程退出(这就是为什么第二次 write 才能触发 SIGPIPE 的原因)。

    SIGPIPE 的处理方式

    为了避免进程退出,既可以对 SIGPIPE 信号进行捕获,也可以将其忽略,即为其设置 SIG_IGN 信号处理函数(在系统头文件 <signal.h> 中定义的常量):

    // 写法一(简单粗暴,不判断出错情况)
    #if defined(SIGPIPE) && !defined(_WIN32)
        (void) signal(SIGPIPE, SIG_IGN);
    #endif
    
    // 写法二(判断返回值情况)
    #ifndef WIN32
        if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
            return 1;
    #endif
    
    // 写法三(使用 sigaction 替代 signal ,可以避免传统 signal 系统调用的问题)
        struct sigaction sa;
        sa.sa_handler = SIG_IGN;
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        if (sigaction(SIGPIPE, &sa, NULL) < 0)
        {
            perror("cannot ignore SIGPIPE");
            return -1;
        }
    
    // 写法四(仅在 IOS 系统上支持 SO_NOSIGPIPE)
    #if defined(SO_NOSIGPIPE) && !defined(MSG_NOSIGNAL)
        // We do not want SIGPIPE if writing to socket.
        const int value = 1;
        setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(int));
    #endif
    

    这样,当第二次调用 write 方法时,会返回 -1,同时 errno 会被设置成 EPIPE ,程序便能知道对端已经关闭。

    展开全文
  • IOCP压力测试 客户端并发1000个连接,发送数据给服务端,服务端接收到数据后,又把数据回去客户端,客户端收到数据后又回给服务端,就这样,大家的网卡都满载了,占用99% 一会就有很多Socket收到以下通知: ...
  • 同样是一个包,除了包头的第一行 ```POST /cgi-bin/do_login HTTP/1.1\r\n``` 在requests中无法定制,其余均一样,为何c++返回了认证结果,requests却返回了认证界面的html源码? 怀疑是包头第一行的问题,但我...
  • sendto函数的坑

    2017-03-08 09:56:00
    测试unix数据报套接字时,一个程序收,一个程序,分别绑定自己的socket。结果在收的部分,返回的发送方的地址总是的,但是返回的地址长度又是对的。 while ( 1 ) { bzero(&clientaddr, sizeof(struct ...

      测试unix数据报套接字时,一个程序收,一个程序发,分别绑定自己的socket。结果在收的部分,返回的发送方的地址总是空的,但是返回的地址长度又是对的。

    while ( 1 )
    {
          bzero(&clientaddr, sizeof(struct sockaddr_un));
          slen = 0;
          rn = recvfrom(fd,buf, sizeof(buf), 0 ,(struct sockaddr *)&clientaddr, slen);
          if ( rn == -1)
          {
                    perror("recvfrom");
          } 
          buf[n] = 0;   
    }

          仔细对比unp的代码,发现   slen = 0  这行改成   slen = sizeof(strcut sockaddr_un) 结果就对了,细看man

      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    =====================================================================================================================
        If src_addr is not NULL, and the underlying protocol provides the source address, this source address is filled in. When src_addr is NULL, nothing is filled in; in this case, addrlen is not used, and should also be NULL. The argument addrlen is a value-result argument, which the caller should initialize before the call to the size of the buffer associated with src_addr, and modified on return to indicate the actual size of the source address. The returned address is truncated if the buffer provided is too small; in this case, addrlen will return a value greater than was supplied to the call.

      红色部分指出,最后一个参数addrlen是一个"值-结果"的参数,赋给它的初始值用来指定拷贝到倒数第二个参数 src_addr 里面的字节数,返回实际值是实际的源地址结构的大小。当传入的参数小于输出的值,说明返回的源地址被截断了。

    上面的例子中,传入的值为0,而输出的值大于0,明显这里有问题,未拷贝任何数据到返回的源地址clientaddr。

    转载于:https://www.cnblogs.com/thammer/p/6517987.html

    展开全文
  • chatRoom 聊天室

    2012-04-03 03:23:09
    /* 创建10行10列的多行文本域 */ jta.setEditable(false); /* 设置多行文本域为不可编辑 */ jta.setFont(f); /* 设置多行文本域字体 */ label = new JLabel(name + ":"); /* 创建带有用户名的文本标签 */ ...
  • 如果只进行单次传输就关闭客服端的话,就直接采用...因为服务器要等着读取客户端消息 (这时的read可以直接读取一个null返回,相当不再是阻塞,通过读取的值为null,如果后面的操作要用的读取的值,则会发生指针
    ------- android培训java培训、期待与您交流! ----------
    

    如果只进行单次传输就关闭客服端的话,就直接采用Socket中的shutdownOutput()  禁用此套接字的输出流。

    如果还需还需要再给服务端发送信息,直接进行shutdownOutput() ,把输出流关了,就是不太合适了,

    因为服务器要等着读取客户端发消息 (这时的read可以直接读取一个null返回,相当不再是阻塞,通过读取的值为null,如果后面的操作要用的读取的值,则会发生空指针异常。

    那么,就不要再去纠结 把 关闭流后紧接着会打开流 搞入同步什么的,没必要而且还浪费时间,我之前就这么搞了下,玛德,超级复杂,还容易出错。。。

    下面,介绍一种超级简单的方法:结束标记。

             哈哈,很熟悉是吧!还被老师注重强调过,正因为如此被洗脑的不轻。

    什么搞个复杂的字符串,跟可气的是老师还把什么时间戳给搬出来了,想法是非常好的,搞个时间戳还让我学习了半天,

       嗯,觉得对自己的能力是有所提升的,还蛮欣慰的,但刚要写完,我就冲动的想砸电脑了

    不就是把文件读完吗!妈的蛋,有必要一定要给个读到末尾结束标记才能停止循环吗!玛德,我读完这么大的文件不就行了吗!去你的末尾结束标记!

    这么简单的问题,只能客户端在上传文件之前,告诉服务端要上传的文件大小,服务端你读完了这么多个字节,就结束读取。不用在那里等着我给你结束标记,你自己结束。

    客户端从服务器上下载文件也是一样。 去他妈的时间戳


    下面我是写的客户端登录服务器,并选择上传或下载,有兴趣就看,没 就算了,上面的能记住就行了!


    客户端:


    package com.test;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    /*
     * 需求:客户端连接服务端后要求输入用户名和密码进行登录
     * 登录成功后,选择上传或下载or退出。
     *	 上传只能上传jpg格式的图片且大小小于8M
     *
     *
     */
    
    public class TCPClient2  {
    
    	//创建客户端Socket服务
    	private static Socket s = null;
    	
    	
    	private static BufferedReader bufr = null;
    			
    	private static PrintWriter pw = null;
    	private static PrintStream ps = null; 
    	private static BufferedReader bufinr = null;
    	private static  BufferedInputStream bufins = null;		
    	
    	private static String info = null;
    	
    	TCPClient2(Socket s) throws Exception{
    		this.s = s ;
    		bufr = new BufferedReader(new InputStreamReader(System.in)); //键盘录入
    		bufinr = new BufferedReader(new InputStreamReader(s.getInputStream())); //字符流读取
    		pw = new PrintWriter(s.getOutputStream(),true);		 //字符流写出
    		register();
    	}
    	
    		
    	//把用户名和密码发到服务端进行校验
    	public static void register() throws Exception{
    		while(true){
    			System.out.print("用户名:");
    			String name = bufr.readLine();
    			System.out.print("密码:");
    			String key = bufr.readLine();
    			pw.println(name);
    			pw.println(key);
    			info = bufinr.readLine();
    			System.out.println(info);
    			if(info.contains("欢迎")){//欢迎某某用户
    				action();
    			}
    		}
    	}
    	
    	//选择,不同的操作()
    	public static boolean select() throws Exception{
    		info = bufinr.readLine(); 
    		System.out.println(info);//请选择你所需要的服务(输入正确数字,没有进行处理):1,上传  2,下载  3,退出
    		while(true){
    			int no = new Integer(bufr.readLine());
    			pw.println(no);
    			info = bufinr.readLine();
    			//选择的操作有效
    			if(info.contains("准备"))
    				return true;
    			System.out.println(info);
    		}
    	}
    	
    	//根据用户的选择,进行相应的操作
    	public static void action() throws Exception{
    		select();
    		info = bufinr.readLine(); //
    		System.out.println(info);
    		
    		//上传文件 -- 请输入需要上传的文件:
    		if(info.contains("上传")){
    			String fileName =null;
    			File f = null;
    			while(true){
    				fileName = bufr.readLine();//键盘获取文件名
    				f = new File(fileName);
    				if((f.exists()))
    					break;
    				System.out.print("文件不存在或输入有误,请重新输入:");
    			}
    			long fileLength = f.length(); //以文件的大小为结束标记
    			pw.println(fileLength);
    			pw.println(fileName);
    			BufferedInputStream fis = 
    					new BufferedInputStream(new FileInputStream(f));
    			ps = new PrintStream(new BufferedOutputStream(s.getOutputStream()),true);
    			byte[] buf = new byte[1024*1024*8];
    			int len = 0;
    			while((len=fis.read(buf))!=-1){
    				ps.write(buf,0,len);
    				ps.flush();
    			}
    			System.out.println(bufinr.readLine()); 
    			fis.close();
    			action();
    		}
    		
    		
    		//下载文件 --选择需要下载的文件
    		if(info.contains("下载")){
    			
    			int count = new Integer(bufinr.readLine());
    			//读取服务端发来的所有可下载的文件信息
    			for(int x=0 ; x<count ; x++){
    				info=bufinr.readLine();
    				System.out.println(info);
    			}
    			select();//选择文件
    			info = bufinr.readLine(); //服务器获取文件名
    			File f = new File("G:\\"+info);
    			long fileLength = new Long(bufinr.readLine());
    			BufferedOutputStream fos =
    					new BufferedOutputStream(new FileOutputStream(f));
    			bufins = new BufferedInputStream(s.getInputStream());
    			byte[] buf = new byte[1024*1024*8];
    			int len = 0; //传输文件
    			long lens = 0;
    			while(lens<fileLength){
    				len = bufins.read(buf);
    				fos.write(buf,0,len);
    				fos.flush();
    				lens = lens +len;
    			}
    			fos.close();
    			System.out.println("下载成功");
    			action();
    		}
    		
    		//退出 ---断开登录
    		if(info.contains("断开")){
    			register();
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
    		new TCPClient2(new Socket("192.168.1.101",10010));
    	}
    }
    


    服务端:


    package com.test;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    /*
     * 需求:客户端连接服务端后要求输入用户名和密码进行登录
     * 登录成功后,选择上传或下载or退出。
     *	 上传只能上传jpg格式的图片且大小小于8M
     *
     *
     */
    
    public class TCPClient2  {
    
    	//创建客户端Socket服务
    	private static Socket s = null;
    	
    	
    	private static BufferedReader bufr = null;
    			
    	private static PrintWriter pw = null;
    	private static PrintStream ps = null; 
    	private static BufferedReader bufinr = null;
    	private static  BufferedInputStream bufins = null;		
    	
    	private static String info = null;
    	
    	TCPClient2(Socket s) throws Exception{
    		this.s = s ;
    		bufr = new BufferedReader(new InputStreamReader(System.in)); //键盘录入
    		bufinr = new BufferedReader(new InputStreamReader(s.getInputStream())); //字符流读取
    		pw = new PrintWriter(s.getOutputStream(),true);		 //字符流写出
    		register();
    	}
    	
    		
    	//把用户名和密码发到服务端进行校验
    	public static void register() throws Exception{
    		while(true){
    			System.out.print("用户名:");
    			String name = bufr.readLine();
    			System.out.print("密码:");
    			String key = bufr.readLine();
    			pw.println(name);
    			pw.println(key);
    			info = bufinr.readLine();
    			System.out.println(info);
    			if(info.contains("欢迎")){//欢迎某某用户
    				action();
    			}
    		}
    	}
    	
    	//选择,不同的操作()
    	public static boolean select() throws Exception{
    		info = bufinr.readLine(); 
    		System.out.println(info);//请选择你所需要的服务(输入正确数字,没有进行处理):1,上传  2,下载  3,退出
    		while(true){
    			int no = new Integer(bufr.readLine());
    			pw.println(no);
    			info = bufinr.readLine();
    			//选择的操作有效
    			if(info.contains("准备"))
    				return true;
    			System.out.println(info);
    		}
    	}
    	
    	//根据用户的选择,进行相应的操作
    	public static void action() throws Exception{
    		select();
    		info = bufinr.readLine(); //
    		System.out.println(info);
    		
    		//上传文件 -- 请输入需要上传的文件:
    		if(info.contains("上传")){
    			String fileName =null;
    			File f = null;
    			while(true){
    				fileName = bufr.readLine();//键盘获取文件名
    				f = new File(fileName);
    				if((f.exists()))
    					break;
    				System.out.print("文件不存在或输入有误,请重新输入:");
    			}
    			long fileLength = f.length(); //以文件的大小为结束标记
    			pw.println(fileLength);
    			pw.println(fileName);
    			BufferedInputStream fis = 
    					new BufferedInputStream(new FileInputStream(f));
    			ps = new PrintStream(new BufferedOutputStream(s.getOutputStream()),true);
    			byte[] buf = new byte[1024*1024*8];
    			int len = 0;
    			while((len=fis.read(buf))!=-1){
    				ps.write(buf,0,len);
    				ps.flush();
    			}
    			System.out.println(bufinr.readLine()); 
    			fis.close();
    			action();
    		}
    		
    		
    		//下载文件 --选择需要下载的文件
    		if(info.contains("下载")){
    			
    			int count = new Integer(bufinr.readLine());
    			//读取服务端发来的所有可下载的文件信息
    			for(int x=0 ; x<count ; x++){
    				info=bufinr.readLine();
    				System.out.println(info);
    			}
    			select();//选择文件
    			info = bufinr.readLine(); //服务器获取文件名
    			File f = new File("G:\\"+info);
    			long fileLength = new Long(bufinr.readLine());
    			BufferedOutputStream fos =
    					new BufferedOutputStream(new FileOutputStream(f));
    			bufins = new BufferedInputStream(s.getInputStream());
    			byte[] buf = new byte[1024*1024*8];
    			int len = 0; //传输文件
    			long lens = 0;
    			while(lens<fileLength){
    				len = bufins.read(buf);
    				fos.write(buf,0,len);
    				fos.flush();
    				lens = lens +len;
    			}
    			fos.close();
    			System.out.println("下载成功");
    			action();
    		}
    		
    		//退出 ---断开登录
    		if(info.contains("断开")){
    			register();
    		}
    	}
    	
    	public static void main(String[] args) throws Exception {
    		new TCPClient2(new Socket("192.168.1.101",10010));
    	}
    }
    


    key文件 用户 密码 自己随便写:








    展开全文
  • Socket最初是在Unix上出现的,后来微软将它引入了Windows中(包括Win98和WinNt);后两个控件的作用是用来使程序具有FTP(File TransferProtocol文件传输协议)和SMTP(Simple Mail TransferProtocol简单邮件传输...
  • 飞鸽传书(IPMessenger) 源码

    热门讨论 2010-06-29 14:10:51
     有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会...
  • b、效验接受超时(即只连接不数据)断开连接,防止连接;c、效验空闲超时(即心跳超时)断开连接。 按工作量来分,最繁重的是处理线程,其次是工作线程,最闲的是看守线程。可通过OnThread事件回调函数设置线程...
  • b、效验接受超时(即只连接不数据)断开连接,防止连接;c、效验空闲超时(即心跳超时)断开连接。 按工作量来分,最繁重的是处理线程,其次是工作线程,最闲的是看守线程。可通过OnThread事件回调函数设置线程...
  • 5. Labor 们将各自的测试结果返回给 Server。 6. 所有 Labor 完成测试后,由 Server 将汇总的测试结果发送给 Client。 7. Client 生成测试报告。 有兴趣的同学可以访问 ...
  • 互联网支持库中的“FTP目录列表”命令返回的文件时间改为FTP服务器返回的原始时间,不做任何时区转换。 4. 互联网支持库中的“置代理服务器”命令增加了参数,用于支持代理服务器用户认证。 5. 修改控制台操作...
  • c# 加密和解密相关代码

    热门讨论 2011-09-06 11:04:59
    如果此字符串是字符串,则返回的数组为且 长度为零。 (2)Convert 类的ToChar 方法 Convert 类的ToChar 方法用来将指定的值转换为Unicode 字符,该方法为可重载方法,本实例中用到的它 的重载形式如下: public...
  • java基础入门教程

    热门讨论 2009-04-29 21:36:10
    3 Java 语 言 的 动 画 效 果 远 比 GUI技 术 更 加 逼 真 ,尤 其 是 利用WW W提 供 的 巨 大动 画 资 源 间 ,可 以 共 享 全 世 界 的 动 态 画面 的 资 源 。 4 软 件 最 终 产 品 :用 Java 语 言 开 的 ...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    ListenSocket.h 侦听接口类文件 ChatSocket.h 聊天接口类文件 SettingDlg.h 设置对话框类文件 LocalInfoDlg.h 查看本地信息对话框类文件 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 如题。 FTP、...
  • X-Scan

    热门讨论 2008-04-04 15:19:43
    - 根据端口返回的信息智能判断该端口对应的服务 “主动识别操作系统类型” - 端口扫描结束后采用NMAP的方法由TCP/IP堆栈指纹识别目标操作系统 “预设知名服务端口” - 如标题所述 <br> “SNMP相关设置”...
  • X-Scan v3.1

    2018-10-22 08:43:03
    “根据响应识别服务” - 根据端口返回的信息智能判断该端口对应的服务 “主动识别操作系统类型” - 端口扫描结束后采用NMAP的方法由TCP/IP堆栈指纹识别目标操作系统 “预设知名服务端口” - 如标题所述 “SNMP...
  • vc++ 应用源码包_2

    2012-09-15 14:27:40
    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、...
  • vc++ 应用源码包_1

    2012-09-15 14:22:12
    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、...
  • vc++ 应用源码包_6

    2012-09-15 14:59:46
    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序...
  • vc++ 应用源码包_5

    2012-09-15 14:45:16
    独立打包,保证可解压,内含大量源码,网上搜集而来。一共10几包,每个包几十兆。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序...
  • vc++ 应用源码包_4

    2012-09-15 14:38:35
    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、...
  • vc++ 应用源码包_3

    2012-09-15 14:33:15
    独立打包,保证可解压,内含大量源码,网上搜集而来。 Visual.C++编程技巧精选500例源代码 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

发socket返回空