C++TCP和UDP属于传输层协议

TCP和UDP属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它事先为要发送的数据开辟好连接通道(三次握手),然后再进行数据发送;而UDP则不为IP提供可靠性,一般用于实时的视频流传输,像rtp、rtsp就是建立在udp的基础上的。

     首先谈谈tcp socket

    tcp简单的三次握手过程如图,

    SYN(Synchronize Sequence Numbers):同步标志  

    ACK(Acknowledgement Number)        :确认标志

    图中可以看出,三次握手的过程是在c的connect()和s的bind()、listen()、accept()函数中完成的,这样开辟了相对可靠的连接通道,来传输数据。

UDP的socket编程过程如下图所示:

下面翠花上代码啦!大笑

服务端:

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <Winsock2.h> //windows socket的头文件   
  3.   
  4. #pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件   
  5.   
  6. void main()  
  7. {  
  8.     //初始化winsocket   
  9.     WORD wVersionRequested;  
  10.     WSADATA wsaData;  
  11.     int err;  
  12.   
  13.     wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节   
  14.   
  15.     err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。   
  16.     if ( err != 0 )  
  17.     {  
  18.         return;  
  19.     }  
  20.   
  21.     if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容         
  22.     {  
  23.         WSACleanup( );  
  24.         return;  
  25.     }  
  26.   
  27.     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP   
  28.   
  29.     SOCKADDR_IN addrSrv;   
  30.     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //htonl用来将主机字节顺序转换为网络字节顺序(to network long)   
  31.     //INADDR_ANY就是指定地址为0.0.0.0的地址,   
  32.     //表示不确定地址,或“任意地址”。”   
  33.     addrSrv.sin_family=AF_INET;   
  34.     addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short)   
  35.   
  36.     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket   
  37.   
  38.     listen(sockSrv,5);//socket监听,准备接受连接请求。   
  39.   
  40.     SOCKADDR_IN addrClient;  
  41.     int len=sizeof(SOCKADDR);  
  42.   
  43.     while(1)  
  44.     {  
  45.         SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接   
  46.   
  47.         char sendBuf[50];  
  48.         sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针   
  49.         send(sockConn,sendBuf,strlen(sendBuf)+1,0);  
  50.   
  51.         char recvBuf[50];  
  52.         recv(sockConn,recvBuf,50,0);  
  53.         printf("%s\n",recvBuf);  
  54.   
  55.         closesocket(sockConn);  
  56.         Sleep(2000);//2000毫秒   
  57.     }  
  58.     WSACleanup();  
  59. }  
#include <stdio.h>
#include <Winsock2.h> //windows socket的头文件
#pragma comment( lib, "ws2_32.lib" )// 链接Winsock2.h的静态库文件
void main()
{
//初始化winsocket
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节
err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容		
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建socket。AF_INET表示在Internet中通信;SOCK_STREAM表示socket是流套接字,对应tcp;0指定网络协议为TCP/IP
SOCKADDR_IN addrSrv; 
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);	//htonl用来将主机字节顺序转换为网络字节顺序(to network long)
//INADDR_ANY就是指定地址为0.0.0.0的地址,
//表示不确定地址,或“任意地址”。”
addrSrv.sin_family=AF_INET; 
addrSrv.sin_port=htons(4000);//htons用来将主机字节顺序转换为网络字节顺序(to network short)
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将本地地址绑定到所创建的socket上,以使在网络上标识该socket
listen(sockSrv,5);//socket监听,准备接受连接请求。
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//为一个连接请求提供服务。addrClient包含了发出连接请求的客户机IP地址信息;返回的新socket描述服务器与该客户机的连接
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));//inet_ntoa网络地址转换转点分十进制的字符串指针
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
Sleep(2000);//2000毫秒
}
WSACleanup();
}


客户端:

 

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <Winsock2.h>   
  3.   
  4. #pragma comment( lib, "ws2_32.lib" )    
  5.   
  6.   
  7. void main()  
  8. {  
  9.     WORD wVersionRequested;  
  10.     WSADATA wsaData;  
  11.     int err;  
  12.   
  13.     wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节   
  14.   
  15.     err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。   
  16.     if ( err != 0 )  
  17.     {  
  18.         return;  
  19.     }  
  20.   
  21.     if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容         
  22.     {  
  23.         WSACleanup( );  
  24.         return;  
  25.     }  
  26.     for(int index=0;;index++)  
  27.     {  
  28.         SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);  
  29.   
  30.         SOCKADDR_IN addrClt;//需要包含服务端IP信息   
  31.         addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");// inet_addr将IP地址从点数格式转换成网络字节格式整型。   
  32.         addrClt.sin_family=AF_INET;   
  33.         addrClt.sin_port=htons(4000);  
  34.   
  35.         connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求   
  36.         char recvBuf[50];  
  37.         recv(sockClient,recvBuf,50,0);  
  38.         printf("my reply is : %s\n",recvBuf);  
  39.   
  40.         char sendBuf[50];  
  41.         sprintf(sendBuf,"%3d,",index);  
  42.         strcat(sendBuf,"server node of: yaopeng");  
  43.         send(sockClient,sendBuf,strlen(sendBuf)+1,0);  
  44.   
  45.         closesocket(sockClient);  
  46.         Sleep(2000);  
  47.     }  
  48.     WSACleanup();  
  49. }  
#include <stdio.h>
#include <Winsock2.h>
#pragma comment( lib, "ws2_32.lib" ) 
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//第一个参数为低位字节;第二个参数为高位字节
err = WSAStartup( wVersionRequested, &wsaData );//对winsock DLL(动态链接库文件)进行初始化,协商Winsock的版本支持,并分配必要的资源。
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )//LOBYTE()取得16进制数最低位;HIBYTE()取得16进制数最高(最左边)那个字节的内容		
{
WSACleanup( );
return;
}
for(int index=0;;index++)
{
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrClt;//需要包含服务端IP信息
addrClt.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");// inet_addr将IP地址从点数格式转换成网络字节格式整型。
addrClt.sin_family=AF_INET; 
addrClt.sin_port=htons(4000);
connect(sockClient,(SOCKADDR*)&addrClt,sizeof(SOCKADDR));//客户机向服务器发出连接请求
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("my reply is : %s\n",recvBuf);
char sendBuf[50];
sprintf(sendBuf,"%3d,",index);
strcat(sendBuf,"server node of: yaopeng");
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
closesocket(sockClient);
Sleep(2000);
}
WSACleanup();
}



 

对于tcp socket,有几点需要注意:

一、TCP的TIME_WAIT状态(等待客户端的相应)    

注*  TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟(MSL是最大分段生存期,指明TCP报文在Internet上最长生存时间)

    当服务器端socket绑定本地地址并占用了端口,此时如果匆忙结束;或者连接的服务器异常退出,这个时候被占用的端口不能马上释放,需要TIME_WAIT。即便调用closesocket()一般也不会立即关闭socket,仍可继续重用该socket。所以重新启动服务器时可能会出现问题。例如MFC中在子窗口中实现socket通信,那么关闭子窗口再打开就会出问题了。

     解决方法是在bind()之前添加setsockopt()函数,解除端口绑定。

介绍setsockopt()之前我们再来回顾一下三次握手协议的具体流程:

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 

完成三次握手,客户端与服务器开始传送数据。

setsockopt()使用方法如下:

    1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));

    2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
BOOL  bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));

更多setsockopt()函数用例可参考百度百科:http://baike.baidu.com/view/569217.htm

 

 二、对于大型文件,一般需要将其剁碎了一部分一部分的传。TCP不能保证接收方顺序的收到包,对于需要实时显示的文件可以在发送方发出包后设置来自接收方的响应,即对方收到前一个包后再发送下一个包。

目前就这么多,各位看官有其他的注意事项拜托请留言补充,小弟感激啊。

 

下面简单说下UDP socket

    UDP不能保证双方的可靠连接,容易出现丢包现象。

    UDP的socket编程过程如下图所示:

 

上代码了,哈哈。

服务端:

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <Winsock2.h>   
  3.   
  4. #pragma comment( lib, "ws2_32.lib" )    
  5.    
  6. void main()  
  7. {  
  8.     WORD wVersionRequested;  
  9.     WSADATA wsaData;  
  10.     int err;  
  11.   
  12.     wVersionRequested = MAKEWORD( 1, 1 );   
  13.   
  14.     err = WSAStartup( wVersionRequested, &wsaData );   
  15.     if ( err != 0 ) {  
  16.         return;  
  17.     }  
  18.   
  19.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  20.         HIBYTE( wsaData.wVersion ) != 1 ) {   
  21.             WSACleanup( );  
  22.             return;  
  23.     }  
  24.     SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);  
  25.       
  26.     int len=sizeof(SOCKADDR);  
  27.       
  28.     SOCKADDR_IN from;     
  29.     SOCKADDR_IN local;   
  30.     local.sin_addr.S_un.S_addr=htonl(INADDR_ANY);   
  31.     local.sin_family=AF_INET;   
  32.     local.sin_port=htons(27015);   
  33.   
  34.     int a = bind(sockSrv,(SOCKADDR*)&local,len);  
  35.    
  36.       
  37.   
  38.     while(1)  
  39.     {  
  40.         char recvBuf[50];  
  41.         recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&from,&len);//from收到客户端的IP信息   
  42.         printf("%s\n",recvBuf);  
  43.         printf("%s\n",inet_ntoa(local.sin_addr));  
  44.         char sendBuf[50];  
  45.         sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(from.sin_addr));    
  46.         sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&from,len);  
  47.           
  48.         Sleep(2000);  
  49.     }  
  50.     closesocket(sockSrv);  
  51.     WSACleanup();  
  52. }  
#include <stdio.h>
#include <Winsock2.h>
#pragma comment( lib, "ws2_32.lib" ) 
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); 
err = WSAStartup( wVersionRequested, &wsaData ); 
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) { 
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
int len=sizeof(SOCKADDR);
SOCKADDR_IN from;	
SOCKADDR_IN local; 
local.sin_addr.S_un.S_addr=htonl(INADDR_ANY); 
local.sin_family=AF_INET; 
local.sin_port=htons(27015); 
int a = bind(sockSrv,(SOCKADDR*)&local,len);
while(1)
{
char recvBuf[50];
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&from,&len);//from收到客户端的IP信息
printf("%s\n",recvBuf);
printf("%s\n",inet_ntoa(local.sin_addr));
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(from.sin_addr));  
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&from,len);
Sleep(2000);
}
closesocket(sockSrv);
WSACleanup();
}


客户端:

[cpp] view plaincopyprint?
  1. #include <stdio.h>   
  2. #include <Winsock2.h>   
  3.   
  4. #pragma comment( lib, "ws2_32.lib" )    
  5.   
  6.   
  7. void main()  
  8. {  
  9.     WORD wVersionRequested;  
  10.     WSADATA wsaData;  
  11.     int err;  
  12.   
  13.     wVersionRequested = MAKEWORD( 1, 1 );   
  14.   
  15.     err = WSAStartup( wVersionRequested, &wsaData );   
  16.     if ( err != 0 ) {  
  17.         return;  
  18.     }  
  19.   
  20.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  21.         HIBYTE( wsaData.wVersion ) != 1 ) {   
  22.             WSACleanup( );  
  23.             return;  
  24.     }  
  25.       
  26.   
  27.     for(int index=0;;index++)  
  28.     {  
  29.         SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);  
  30.   
  31.         int len = sizeof(SOCKADDR);  
  32.   
  33.         SOCKADDR_IN local;  
  34.         local.sin_addr.S_un.S_addr=inet_addr("192.168.0.30");   
  35.         local.sin_family=AF_INET;   
  36.         local.sin_port=htons(27015);   
  37.    
  38.         char sendBuf[30];  
  39.         sprintf(sendBuf,"%3d,",index);  
  40.         strcat(sendBuf,"server node of: yaopeng");  
  41.         sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&local,len);  
  42.   
  43.         char recvBuf[50];  
  44.         recvfrom(sockClient,recvBuf,50,0,(SOCKADDR*)&local,&len);  
  45.         printf("my reply is : %s\n",recvBuf);  
  46.         printf("%s\n",inet_ntoa(local.sin_addr));  
  47.   
  48.         closesocket(sockClient);  
  49.         Sleep(2000);  
  50.         WSACleanup();  
  51.     }  
  52. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员如何利用空闲时间挣零花钱

一&#xff1a; 私活 作为一名程序员&#xff0c;在上班之余&#xff0c;我们有大把的时间&#xff0c;不能浪费&#xff0c;这些时间其实都是可以用来挖掘自己潜在的创造力&#xff0c;今天要讨论的话题就是&#xff0c;程序员如何利用空余时间挣零花钱&#xff1f;比如说周末…

编写程序乘法口诀表C语言,陈广川问:c语言编程九九乘法口诀表 怎样用c语言写九九乘法口诀表?...

怎样用c语言写九九乘法口诀表&#xff1f;哈哈&#xff0c;我刚刚用javascript写好乘法口诀表。C语言&#xff0c;如何编写程序输出九九乘法表。形式如下 ********* ******** ******* ****** ***** **** *** ** *&#xff1f;两个循环&#xff0c;一般用for循环 一个循环控制行…

PHP中文乱码解决办法

一&#xff0e;首先是PHP网页的编码 1. php文件本身的编码与网页的编码应匹配 a. 如果欲使用gb2312编码&#xff0c;那么php要输出头&#xff1a;header(“Content-Type: text/html; charsetgb2312")&#xff0c;静态页面添加<meta http-equiv"Content-T…

python中api_通过Python中的API查找相关的工作技能

python中api工作技能世界 (The World of Job Skills) So you want to figure out where your skills fit into today’s job market. Maybe you’re just curious to see a comprehensive constellation of job skills, clean and standardized. Or you need a taxonomy of ski…

欺诈行为识别_使用R(编程)识别欺诈性的招聘广告

欺诈行为识别背景 (Background) Online recruitment fraud (ORF) is a form of malicious behaviour that aims to inflict loss of privacy, economic damage or harm the reputation of the stakeholders via fraudulent job advertisements.在线招聘欺诈(ORF)是一种恶意行为…

PE文件的感染C++源代码

PE文件的感染C源代码 PE文件规定了可执行文件的格式&#xff0c;凡是符合此格式的文件都能在windows系统上运行。PE文件的格式暂且不谈&#xff0c;说一些感染PE文件的几种途径。 导入表感染。这个涉及比较复杂的操作&#xff0c;首先&#xff0c;要自行写一个dll文件&#x…

c语言实验四报告,湖北理工学院14本科C语言实验报告实验四数组

湖北理工学院14本科C语言实验报告实验四 数组.doc实验四 数 组实验课程名C语言程序设计专业班级 14电气工程2班 学号 201440210237 姓名 熊帆 实验时间 5.12-5.26 实验地点 K4-208 指导教师 祁文青 一、实验目的和要求1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法&a…

c语言宏定义

一. #define是C语言中提供的宏定义命令&#xff0c;其主要目的是为程序员在编程时提供一定的方便&#xff0c;并能在一定程度上提高程序的运行效率&#xff0c;但学生在学习时往往不能理解该命令的本质&#xff0c;总是在此处产生一些困惑&#xff0c;在编程时误用该命令&#…

rabbitmq channel参数详解【转】

1、Channel 1.1 channel.exchangeDeclare()&#xff1a; type&#xff1a;有direct、fanout、topic三种durable&#xff1a;true、false true&#xff1a;服务器重启会保留下来Exchange。警告&#xff1a;仅设置此选项&#xff0c;不代表消息持久化。即不保证重启后消息还在。原…

感染EXE文件代码(C++)

C代码#include <windows.h> #include <winnt.h> #include <stdio.h> #include <assert.h> #define DEBUG 1 #define EXTRA_CODE_LENGTH 18 #define SECTION_SIZE 0x1000 #define SECTION_NAME ".eViLhsU" #define F…

nlp gpt论文_GPT-3:NLP镇的最新动态

nlp gpt论文什么是GPT-3&#xff1f; (What is GPT-3?) The launch of Open AI’s 3rd generation of the pre-trained language model, GPT-3 (Generative Pre-training Transformer) has got the data science fraternity buzzing with excitement!Open AI的第三代预训练语言…

真实不装| 阿里巴巴新人上路指北

新手上路&#xff0c;总想听听前辈们分享他们走过的路。橙子选取了阿里巴巴合伙人逍遥子&#xff08;阿里巴巴集团CEO&#xff09; 、Eric&#xff08;蚂蚁金服董事长兼CEO&#xff09;、Judy&#xff08;阿里巴巴集团CPO&#xff09;的几段分享&#xff0c;他们是如何看待职场…

小程序学习总结

上个周末抽空了解了一下小程序,现在将所学所感记录以便日后翻看;需要指出的是我就粗略过了下小程序的api了解了下小程序的开发流程以及工具的使用,然后写了一个小程序的demo;在我看来,如果有前端基础学习小程序无异于锦上添花了,而我这个三年的码农虽也写过不少前端代码但离专业…

tomcat java环境配置

jsp 环境变量配置 一、配置JDK 首先&#xff0c;从Sun网站上下载jdk。 双击jdk-1_5_0_04-windows-i586-p.exe开始安装&#xff0c;默认安装到C:/Program Files/Java/jdk1.5.0_04&#xff0c;你也可以更改路径&#xff0c;但要记住最后选择的路径&#xff0c;设置环境变量的时候…

uber 数据可视化_使用R探索您在Uber上的活动:如何分析和可视化您的个人数据历史记录

uber 数据可视化Perhaps, dear reader, you are too young to remember that before, the only way to request a particular transport service such as a taxi was to raise a hand to make a signal to an available driver, who upon seeing you would stop if he was not …

java B2B2C springmvc mybatis电子商城系统(四)Ribbon

2019独角兽企业重金招聘Python工程师标准>>> 一&#xff1a;Ribbon是什么&#xff1f; Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法&#xff0c;将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如…

c语言函数的形参有几个,C中子函数最多有几个形参

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼C89 31个&#xff0c;C99 127个。ANSI C892.2.4.1 Translation limitsThe implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following lim…

Linux上Libevent的安装

1、下载wget -O libevent-2.0.21-stable.tar.gz https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz2、解压 tar zxvf libevent-2.0.21-stable.tar.gz3、配置安装路径 cd libevent-2.0.21-stable ./configure -prefix/usr4、编译并安装 make make …

Win7安装oracle 10 g

开始-运行-输入hdwwiz-回车 ——选则手动 ——网络适配器——左边选Microsoft&#xff0c;右边找到Microsoft Loopback Adapter ——完成 打开 控制面板\网络和 Internet\网络和共享中心 会发现多了一个本地连接 点详细信息 发现是Microsoft Loopback Adapter的。…

基于plotly数据可视化_[Plotly + Datashader]可视化大型地理空间数据集

基于plotly数据可视化简介(我们将创建的内容)&#xff1a; (Introduction (what we’ll create):) Unlike the previous tutorials in this map-based visualization series, we will be dealing with a very large dataset in this tutorial (about 2GB of lat, lon coordinat…