socket编程——一个简单的例子(转)

2023-05-16

原文地址:http://blog.csdn.net/wind19/article/details/6156339

 

从一个简单的使用TCP例子开始socket编程,其基本步骤如下:

server                                                  client

 

+++++++                                          ++++++++

创建socket                                          创建socket

+++++++                                          ++++++++

      |                                                         |

      |                                                         |

      |                                                         |

+++++++                                          ++++++++

地址赋值(                                           地址赋值(

自己的地址)                                        服务器地址)

+++++++                                          ++++++++

      |                                                         |

      |                                                         |

      |                                                         |

++++++++                                              |

用bind绑定                                                |

socket和地址                                             |

++++++++                                              |

      |                                                         |

      |                                                         |

      |                                                         |

+++++++                                                 |

listen                                                         |

+++++++                                                  |

      |                                                    ++++++++++

      |   <------------------------------          connect 服务器         

      |                                                    ++++++++++

+++++++                                                  |

accept                                                        |

+++++++                                                  |

      |                                                           |

      |                                                    +++++++++

      |                                                     recv 和send

      |                                                     进行数据处理

      |                                                     +++++++++

+++++++++                                                |

用accept得到                                                 |

的socket进行                                                 |

recv 和 send                                                 |

+++++++++                                                |

      |                                                             |

      |                                                             |

      |                                                             |

+++++++++                                        +++++++++

close socket                                         close socket

+++++++++                                        +++++++++

 

根据以上步骤,服务器端的代码为

 

[cpp]  view plain copy
 
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <sys/socket.h>  
  4. #include <netinet/in.h>  
  5. #include <stdlib.h>  
  6. #include <syslog.h>  
  7. #include <errno.h>  
  8. #define MAX_LISTEN_NUM 5  
  9. #define SEND_BUF_SIZE 100  
  10. #define RECV_BUF_SIZE 100  
  11. #define LISTEN_PORT 1010  
  12. int main()  
  13. {  
  14.   int listen_sock = 0;  
  15.   int app_sock = 0;  
  16.   struct sockaddr_in hostaddr;  
  17.   struct sockaddr_in clientaddr;  
  18.   int socklen = sizeof(clientaddr);  
  19.   char sendbuf[SEND_BUF_SIZE] = {0};  
  20.   char recvbuf[RECV_BUF_SIZE] = {0};  
  21.   int sendlen = 0;  
  22.   int recvlen = 0;  
  23.   int retlen = 0;  
  24.   int leftlen = 0;  
  25.   char *ptr = NULL;  
  26.   memset((void *)&hostaddr, 0, sizeof(hostaddr));  
  27.   memset((void *)&clientaddr, 0, sizeof(clientaddr));  
  28.   hostaddr.sin_family = AF_INET;  
  29.   hostaddr.sin_port = htons(LISTEN_PORT);  
  30.   hostaddr.sin_addr.s_addr = htonl(INADDR_ANY);  
  31.   listen_sock = socket(AF_INET, SOCK_STREAM, 0);  
  32.   if(listen_sock < 0)  
  33.   {  
  34.       syslog(LOG_ERR, "%s:%d, create socket failed", __FILE__, __LINE__);  
  35.       exit(1);  
  36.   }  
  37.   if(bind(listen_sock, (struct sockaddr *)&hostaddr, sizeof(hostaddr)) < 0)  
  38.   {  
  39.       syslog(LOG_ERR, "%s:%d, bind socket failed", __FILE__, __LINE__);  
  40.       exit(1);  
  41.   }  
  42.   if(listen(listen_sock, MAX_LISTEN_NUM) < 0)  
  43.   {  
  44.       syslog(LOG_ERR, "%s:%d, listen failed", __FILE__, __LINE__);  
  45.       exit(1);  
  46.   }  
  47.   while(1)  
  48.   {  
  49.       app_sock = accept(listen_sock, (struct sockaddr *)&clientaddr, &socklen);  
  50.       if(app_sock < 0)  
  51.      {  
  52.         syslog(LOG_ERR, "%s:%d, accept failed", __FILE__, __LINE__);  
  53.         exit(1);  
  54.      }  
  55.      sprintf(sendbuf, "welcome %s:%d here!/n", inet_ntoa(clientaddr.sin_addr.s_addr), clientaddr.sin_port);  
  56.      //send data  
  57.      sendlen = strlen(sendbuf) +1;  
  58.      retlen = 0;  
  59.      leftlen = sendlen;  
  60.      ptr = sendbuf;  
  61.      //while(leftlen)  
  62.      {  
  63.          retlen = send(app_sock, ptr, sendlen, 0);  
  64.       if(retlen < 0)  
  65.       {  
  66.           if(errno == EINTR)  
  67.             retlen = 0;  
  68.         else  
  69.             exit(1);  
  70.       }  
  71.       leftlen -= retlen;  
  72.       ptr += retlen;  
  73.      }  
  74.      //receive data  
  75.      recvlen = 0;  
  76.      retlen = 0;  
  77.      ptr = recvbuf;  
  78.      leftlen = RECV_BUF_SIZE -1;  
  79.      //do  
  80.      {  
  81.          retlen = recv(app_sock, ptr, leftlen, 0) ;  
  82.       if(retlen < 0)  
  83.       {  
  84.           if(errno == EINTR)  
  85.             retlen = 0;  
  86.         else  
  87.             exit(1);  
  88.       }  
  89.       recvlen += retlen;  
  90.       leftlen -= retlen;  
  91.       ptr += retlen;  
  92.      }  
  93.      //while(recvlen && leftlen);  
  94.      printf("receive data is : %s", recvbuf);  
  95.     close(app_sock);  
  96.   }  
  97.   close(listen_sock);  
  98.     
  99.   return 0;  
  100.     
  101.     
  102. }  

 

 

 

客户端代码为:

 

[cpp]  view plain copy
 
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <sys/socket.h>  
  4. #include <netinet/in.h>  
  5. #include <syslog.h>  
  6. #include <errno.h>  
  7. #include <stdlib.h>  
  8. #define MAX_LISTEN_NUM 5  
  9. #define SEND_BUF_SIZE 100  
  10. #define RECV_BUF_SIZE 100  
  11. #define SERVER_PORT 1010  
  12. int main()  
  13. {  
  14.     int sock_fd = 0;  
  15.     char recvbuf[RECV_BUF_SIZE] = {0};  
  16.     char sendbuf[SEND_BUF_SIZE] = {0};  
  17.     int recvlen = 0;  
  18.     int retlen = 0;  
  19.     int sendlen = 0;  
  20.     int leftlen = 0;  
  21.     char *ptr = NULL;  
  22.     struct sockaddr_in ser_addr;  
  23.       
  24.     memset(&ser_addr, 0, sizeof(ser_addr));  
  25.     ser_addr.sin_family = AF_INET;  
  26.     inet_aton("127.0.0.1", (struct in_addr *)&ser_addr.sin_addr);  
  27.     ser_addr.sin_port = htons(SERVER_PORT);  
  28.     sock_fd = socket(AF_INET, SOCK_STREAM, 0);  
  29.     if(sock_fd < 0)  
  30.     {  
  31.         syslog(LOG_ERR, "%s:%d, create socket failed", __FILE__, __LINE__);  
  32.         exit(1);  
  33.     }  
  34.     if(connect(sock_fd, (struct sockaddr *)&ser_addr, sizeof(ser_addr)) < 0)  
  35.     {  
  36.         syslog(LOG_ERR, "%s:%d, connect socket failed", __FILE__, __LINE__);  
  37.         exit(1);  
  38.     }  
  39.      //receive data  
  40.      recvlen = 0;  
  41.      retlen = 0;  
  42.      ptr = recvbuf;  
  43.      leftlen = RECV_BUF_SIZE -1;  
  44.      //do  
  45.      {  
  46.          retlen = recv(sock_fd, ptr, leftlen, 0) ;  
  47.       if(retlen < 0)  
  48.       {  
  49.           if(errno == EINTR)  
  50.             retlen = 0;  
  51.         else  
  52.             exit(1);  
  53.       }  
  54.       recvlen += retlen;  
  55.       leftlen -= retlen;  
  56.       ptr += retlen;  
  57.      }  
  58.      //while(recvlen && leftlen);  
  59.      printf("receive data is : %s", recvbuf);  
  60.      sprintf(sendbuf, "hello server/n");  
  61.      //send data  
  62.      sendlen = strlen(sendbuf) +1;  
  63.      retlen = 0;  
  64.      leftlen = sendlen;  
  65.      ptr = sendbuf;  
  66.     // while(leftlen)  
  67.      {  
  68.          retlen = send(sock_fd, ptr, sendlen, 0);  
  69.       if(retlen < 0)  
  70.       {  
  71.           if(errno == EINTR)  
  72.             retlen = 0;  
  73.         else  
  74.             exit(1);  
  75.       }  
  76.       leftlen -= retlen;  
  77.       ptr += retlen;  
  78.      }  
  79.      close(sock_fd);  
  80.       
  81. }  

 

 

 

现在一个简单的使用tcp的socket通信的例子已经完成了,这里有几个需要说明的问题

1)头文件:

sys/socket.h   包含了socket相关的函数,如socket,send 和recv, 以及struct sockaddr等

netinet/in.h    包含了地址结构,如struct sockaddr_in

errno.h           包含了errno 和 EINTR

syslog.h         包含了syslog相关的信息,其打印结果在/var/log/messages里面

 

2)socket地址

对于IPv4来说,其地址用的是struct sockaddr_in,具体结构如下

[cpp] view plain copy
 
  1. struct in_addr {  
  2.   in_addr_t   s_addr;           /* 32-bit IPv4 address */  
  3.                                 /* network byte ordered */  
  4. };  
  5.   
  6. struct sockaddr_in {  
  7.   uint8_t         sin_len;      /* length of structure (16) */  
  8.   sa_family_t     sin_family;   /* AF_INET */  
  9.   in_port_t       sin_port;     /* 16-bit TCP or UDP port number */  
  10.                                 /* network byte ordered */  
  11.   struct in_addr  sin_addr;     /* 32-bit IPv4 address */  
  12.                                 /* network byte ordered */  
  13.   char            sin_zero[8];  /* unused */  
  14. };  

 


其中sin_len我们一般不关注,也不填(只有在使用routing socket的时候才用到,被内核用来处理各种协议簇的地址结构)。
bind, connect, sendto, 和 sendmsg会把socket地址从程序传递给内核; 而accept, recvfrom, recvmsg, getpeername, 和 getsockname会把地址从内核传递给程序。因为不同协议簇的地址结构是不一样的,所以必须要有一个通用的指针来传递地址,对于ANSI C来说我们一般使用void *,但是socket产生早于ANSI C,所以也就没有使用这个机制,而是使用一个通用的地址结构struct sockaddr来处理的
[cpp] view plain copy
 
  1. struct sockaddr {  
  2.   uint8_t      sa_len;  
  3.   sa_family_t  sa_family;    /* address family: AF_xxx value */  
  4.   char         sa_data[14];  /* protocol-specific address */  
  5. };  

 

IPv6的socket地址为struct sockaddr_in6
[cpp] view plain copy
 
  1. struct in6_addr {  
  2.   uint8_t  s6_addr[16];          /* 128-bit IPv6 address */  
  3.                                  /* network byte ordered */  
  4. };  
  5.   
  6. #define SIN6_LEN      /* required for compile-time tests */  
  7.   
  8. struct sockaddr_in6 {  
  9.   uint8_t         sin6_len;      /* length of this struct (28) */  
  10.   sa_family_t     sin6_family;   /* AF_INET6 */  
  11.   in_port_t       sin6_port;     /* transport layer port# */  
  12.                                  /* network byte ordered */  
  13.   uint32_t        sin6_flowinfo; /* flow information, undefined */  
  14.   struct in6_addr sin6_addr;     /* IPv6 address */  
  15.                                  /* network byte ordered */  
  16.   uint32_t        sin6_scope_id; /* set of interfaces for a scope */  
  17. };  

 

对于sockaddr-in6来说,我们不能用通用的地址struct sockaddr来存储了,而是产用新的通用地址结构struct sockaddr_storage,这个结构足够大可以存储任何系统支持的地址。
[cpp] view plain copy
 
  1. struct sockaddr_storage {  
  2.   uint8_t      ss_len;       /* length of this struct (implementation dependent) */  
  3.   sa_family_t  ss_family;    /* address family: AF_xxx value */  
  4.   /* implementation-dependent elements to provide: 
  5.    * a) alignment sufficient to fulfill the alignment requirements of 
  6.    *    all socket address types that the system support 
  7.    * b) enough storage to hold any type of socket address that the 
  8.    *    system supports. 
  9.    */  
  10. };  

 
几种常见的地址结构



3) 相关函数的的length
对于从程序传地址给内核的函数(如connect),其长度是一个整型值,告诉内核要copy的地址长度。
对于从内核传递给程序的函数(如accpt),其长度是一个整型指针,是一个value-result参数。有两个目的:一告诉内核地址结构的长度,让内核在copy的时候不要超过这个长度;二返回内核真正copy的长度。

4)字节序
socket相关的函数都是使用网络字节序

5)地址转换函数
inet_aton, inet_ntoa, and inet_addr把IPv4字符串地址转为32位的网络字节序地址
inet_ptonand inet_ntop可以转换IPv4和IPv6的地址


6)listen中的backlog
要知道这个值的含义先用说一下,对于一个listen的socket,有两个队列:一个是incomplete connection队列(仅仅收到SYN);一个是complete connection队列(三次握手完成)。accept函数就是在complete connection队列中取一个socket。backlog就是指队列的个数,但不行的是各个地方都没有明确定义这个值,没有说明究竟代表了哪个队列,或是两个队列之和。一般来说可以
同时处理的连接数是backlog的1.5倍,很多地方都用5.

7) getsockname 和 getpeername
这两个函数可以与socket关联的地址,getsockname 和 getpeername分别得到自己和对端的地址
[cpp] view plain copy
 
  1. int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen)  
  2.   
  3. int getpeername(int sockfd , struct sockaddr * peeraddr , socklen_t * addrlen );   

转载于:https://www.cnblogs.com/xindufresne/p/4808420.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket编程——一个简单的例子(转) 的相关文章

  • 在浏览器输入URL,按下回车之后的流程?

    1 在浏览器中输入一个URL 2 查找本地配置文件 如果之前有访问过 浏览器会进行缓存 如果没有的话会在本机域名解析文件hosts文件中寻找是否存在该URL的域名映射 如Windows的配置文件 C Windows System32 dri
  • TCP实现socket通信(python)

    socket简介 UDP实现socket通信 python TCP实现socket通信 python 1 套接字工作流程 服务器端先初始化Socket 建立一个套接字 与端口绑定 bind 用 bind 函数来绑定一个端口号和 IP 地址
  • Qt4代码移植Qt5时的 QTcpServer 64位 BUG

    原Qt4上接口代码如下 void QTcpServer incomingConnection int socketDescriptor 移植到Qt5后 BUG现象就是 用MinGW32位编译出来的程序 QTcpServer工作正常 但用Mi
  • ‘windows socket error:由于目标机器积极拒绝,无法连接。(10061),on API 'connect'的错误?

    1 gt 连接时出现 windows socket error 10061 on API connect 是SOCKET没有启动 SCKTSRVR EXE 或者无法连接到服务器 端口等 使用socketconnect很简单 只要在应用服务器
  • unity游戏开发-socket网络通信

    本篇主要是分享基于unity的客户端socket网络通信方案 关于服务器的c socekt搭建放在了这里 基于C 的Tcp服务端通信 其中关于socekt粘包断包的处理放在这里分享了 C socket粘包断包处理 目录 整体设计 TcpCl
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • Websocket(一)——原理及基本属性和方法

    初次接触 WebSocket 的人 都会问同样的问题 我们已经有了 HTTP 协议 为什么还需要另一个协议 它能带来什么好处 答案很简单 因为 HTTP 协议有一个缺陷 通信只能由客户端发起 举例来说 我们想了解今天的天气 只能是客户端向服
  • 九、网络IO原理-创建ServerSocket的过程

    示例 创建ServerSocker过程 创建ServerSocket并注册端口号8090 ServerSocket server new ServerSocket 8090 while true 循环 final Socket socket
  • 通过socket获取对方ip地址

    struct sockaddr in sa int len sizeof sa if getpeername sockfd struct sockaddr sa len printf 对方IP s inet ntoa sa sin addr
  • Springboot+Netty+Websocket实现消息推送实例

    Springboot Netty Websocket实现消息推送 文章目录 Springboot Netty Websocket实现消息推送 前言 一 引入netty依赖 二 使用步骤 1 引入基础配置类 2 netty服务启动监听器 3
  • 网络编程——epoll

    参考 TCP IP网络编程 尹圣雨 epoll epoll也是Linux下实现I O复用的一种方法 其性能优于select 基于select的I O复用服务器的设计缺陷 调用select函数后 针对所有文件描述符的循环语句 调用select
  • 从0实现基于Linux socket聊天室-实现聊天室的公聊、私聊功能-4

    前面文章链接如下 从0实现基于Linux socket聊天室 多线程服务器模型 1 从0实现基于Linux socket聊天室 多线程服务器一个很隐晦的错误 2 从0实现基于Linux socket聊天室 实现聊天室的登录 注册功能 3 上
  • Unity3d之Socket UDP协议

    原文地址 http blog csdn net dingkun520wy article details 49201245 一 Socket 套接字 UDP协议的特点 1 是基于无连接的协议 没有生成连接的延迟所以速度比TCP快 2 支持一
  • Clamav杀毒软件源码分析笔记[十]

    Clamav杀毒软件源码分析笔记 十 刺猬 http blog csdn net littlehedgehog 客户端处理 服务端已经把主要的工作都已经处理的差不多了 剩下来也就是服务端等待客户端提出请求 然后根据客户端的请求做相应的工作
  • /etc/init.d/mysql: No such file or directory 和 ERROR 2002 (HY000): Can't connect to local MySQL server through socket 解决办法

    更改 etc my cnf client password your password port 3306 socket tmp mysql sock Here follows entries for some specific progr
  • 基于TCP的socket通信

    本文转载自http blog csdn net chocolate001 article details 6612201 基于TCP 面向连接 的socket编程 分为客户端和服务器端 客户端的流程如下 1 创建套接字 socket 2 向
  • C语言实现TCP连接

    开发环境 TCP服务端 TCP UDP测试工具 开发环境 Linux 编程语言 C语言 TCP UDP测试工具工具的使用请自行百度 我们用这款软件模拟TCP服务端 效果展示 代码编写 include
  • TCP/IP编程实现远程文件传输

    TCP IP编程实现远程文件传输 在TCP IP网络结构中 为了保证网络安全 网络人员往往需要在路由器上添加防火墙 禁止非法用户用ftp等安全危害较大的TCP IP协议访问主机 而有时系统维护人员需要用ftp将一些文件从中心机房主机传到前端
  • node socket 简易聊天室

    服务端 const net require net const server net createServer 用户列表 let clients 监听连接 server on connection client gt client on d
  • Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言 首先需要区分一下关闭socket和关闭TCP连接的区别 关闭TCP连接是指TCP协议层的东西 就是两个TCP端之间交换了一些协议包 FIN RST等 具体的交换过程可以看TC

随机推荐

  • continue函数和break函数的区别

    continue函数 谈及contiune函数 xff0c 很多初学者都把它和break弄混淆 xff0c 今天我自己也特意学习了一下 xff0c 在这里分享给大家 当它们用在循环语句的循环体时 xff0c break用于立即退出本层循环
  • linux下进入root用户登录

    1 打开终端 xff0c 输入sudo passwd u root 输入当前用户的登录密码 xff0c 提示如下标红区域信息 解决方案 xff1a 1 xff09 直接输入命令 xff1a su xff0c 输入当前用户登录密码 2 xff
  • 利用Python爬取电影网站

    usr bin env python coding 61 utf 8 39 39 39 本爬虫是用来爬取6V电影网站上的电影资源的一个小脚本程序 xff0c 爬取到的电影链接会通过网页的形式显示出来 39 39 39 import requ
  • python 提取字符串中的数字组成新的字符串

    方法一 有一个字符串text 61 34 aAsmr3idd4bgs7Dlsf9eAF 34 请将text字符串中的数字取出 xff0c 并输出成一个新的字符串 import re text 61 34 aAsmr3idd4bgs7Dlsf
  • Trie树

    转载自http epic 32o cn article asp id 61 47 xff0c 但是这个地址已经不存在了 所以从维基百科拿来个图进行解释 xff1a http zh wikipedia org wiki Trie 今天在vij
  • 【C#学习笔记】读SQL Server2008

    using System using System Data SqlClient namespace ConsoleApplication class Program static void Main string args SqlConn
  • window class, OO

    Wndows中Window Management 的设计 是很符合OO思想 首先每个Window的定义由WNDCLASS结构定义 在WNDCLASS中我们需要给出 Window class name Window的class style 以
  • regex_match

    原型 xff1a bool regex match InputSequence MatchResults Regex Flags 当模式匹配整个输入序列成功时 xff0c 返回的是true 否则返回false 参数说明 1 InputSeq
  • 关于Docker目录挂载的总结

    Docker容器启动的时候 xff0c 如果要挂载宿主机的一个目录 xff0c 可以用 v参数指定 譬如我要启动一个centos容器 xff0c 宿主机的 test目录挂载到容器的 soft目录 xff0c 可通过以下方式指定 xff1a
  • Wireshark网络抓包(一)——数据包、着色规则和提示

    一 数据包详细信息 Packet Details面板内容如下 xff0c 主要用于分析封包的详细信息 帧 xff1a 物理层 链路层 包 xff1a 网络层 段 xff1a 传输层 应用层 1 xff09 Frame 物理层数据帧概况 2
  • FloatingWindow 悬浮窗开源项目总结

    在Android开发中 xff0c 我们不免会遇到悬浮窗展示的需求 xff0c 以下是本人之前star的悬浮窗的开源项目 xff0c 供大家参考 xff1a 一 FloatingWindowDemo 开源项目地址 xff1a https g
  • yum-config-manager的讲解

    问题描述 xff1a yum是RPM的前端程序 xff0c 对于多软件安装时非常好用 xff0c 在虚拟机中想要安装什么软件都可以使用 yum install xff1a 仓库名 命令来快速调用已经安装的仓库里的软件 xff0c 但有时在安
  • 1024与自己做爱做的事情

    1024是什么 xff1f 1024最早起源于一个名为 草榴社区 的论坛 xff0c 该论坛为了防止灌水 xff0c 新用户在论坛内回复与发帖时 xff0c 被限制为 每隔1024秒才可发帖 xff08 回复 xff09 一次 xff0c
  • Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极限

    带宽实际上是区块链吞吐量的最大限制 xff0c 在美国旧金山举办的 Scaling Bitcoin Meetup 中 xff0c Nervos amp Cryptape 研究员张韧从 带宽利用率 角度分析了诸多共识协议的效率和可行性 Alg
  • ES6: import和export

    模块化 前端模块化的好处都已经被说烂了 xff0c 归纳为两点 xff1a 避免全局变量污染有效的处理依赖关系 ES2015 xff08 ES6 xff09 终于引入了模块的概念 xff0c 最近学习了下 xff0c 顺便记下笔记 准备工作
  • 6个常见校园网认证客户端故障原因及解决方法

    故障 一 xff1a 本地连接打叉或受限制 xff1b 客户端 提示 无法获取IP信息 可能原因 1 xff0e 网线虚接 2 xff0e 学生端网络 跳线质量太差 3 xff0e 网卡 或网卡驱动程序过久 4 xff0e 交换机的某个端口
  • C语言编程 求两个数的平均值方法(三种方法)

    第一种方法是最常见的 average 61 xff08 a 43 b xff09 2这种方式 xff0c 求两个数的平均值 第二种方法是 当 a lt b 时 averag 61 a 43 b a 2 这里着重介绍的是第三种方法 avera
  • IDEA创建GIT分支并提交到其他分支

    1 xff0c 创建分支 2 xff0c 提交自己的分支 3 xff0c 写代码 xff0c 写完之后切换到你想要提交的分支 xff0c 例子develop 切花分支 xff0c 选择分支 xff0c checkOut 4 下载该分支的更新
  • 【C#学习笔记】写文件

    using System using System IO namespace ConsoleApplication class Program static void Main string args FileStream file 61
  • socket编程——一个简单的例子(转)

    原文地址 xff1a http blog csdn net wind19 article details 6156339 从一个简单的使用TCP例子开始socket编程 xff0c 其基本步骤如下 xff1a server client 4