javascript原型链继承,为什么会出现这种情况,求大神解答?
 function SuperType() {
            this.colors = ["red", "blue", "green"];
        }

        function SubType() {}

        SubType.prototype = new SuperType();    //继承方法
        var instance1 = new SubType();
        console.log(instance1.colors);
        instance1.colors.push("black");
        console.log(instance1.colors);

        var instance2 = new SubType();
        console.log(instance2.colors);

执行过后,明明只在instance1中的colors数组push一个black,为什么在instance2中会出现,不是又new出来一个新的对象了吗?而且原型中的方法会共享,但继承的对象中,colors属性存在SuoerType实例上呀,为什么会影响到instance2?求大神解答。

图片说明

0

3个回答

 SubType.prototype = new SuperType();

这个语句其实已经重写了SubType的原型链(就是用新的值覆盖了之前的值),其实你可以把SubType理解为对象,prototype理解为这个对象的一个比较特殊的属性。
这时你可以通过SubType.prototype.colors拿到这个数组的引用。
然后执行下面语句的时候

 var instance1 = new SubType();

此时你可以通过instance1.colors也能拿到SubType.prototype.colors同样的数组的引用,这两个是同样的引用(指向同一块内存)。
这里分析一下你拿这个instance1.colors的值,实际上是你在instance1.colors的时候,程序发现在这个对象上没有这个值,这时候就去这个对象的原型链上(也就是instance1.__proto__,如果没有就去instance1.__proto__.__proto__...依此类推)去找这个colors看有没有,结果找到了colors这时才返回给你。
这时往下执行instance1.colors.push("black"),其实效果跟SubType.prototype.colors.push("black")一样的(同一个引用)

总结一下知识点:
1.引用赋值
2.pototype和__proto__
3.new的时候做了什么事情
最后就能理解这个继承到底做了什么事了

--可能有些地方表达有误。

1

SubType.prototype = new SuperType(); //继承方法
你这是一个比较常见继承方法,它是通过把子类的原型对象(prototype)设置成父类的一个实例来进行继承的。
但是只简单的这样设置继承有三个缺点:

  缺点一:执行上面代码会发现父类的构造函数不是像JAVA中那样在给子类进行实例化时执行的,而是在设置继承的时候执行的,并且只执行一次。这往往不是我们希望的,特别是父类的构造函数中有一些特殊操作的情况下。

  缺点二:由于父类的构造函数不是在子类进行实例化时执行,在父类的构造函数中设置的成员变量到了子类中就成了所有实例对象公有的公共变量。由于JavaScript中继承只发生在“获取”属性的值时,对于属性的值是String,Number和Boolean这些数据本身不能被修改的类型时没有什么影响。但是Array和Object类型就会有问题。

  缺点三:如果父类的构造函数需要参数,我们没有办法在实例化时传递参数。

应该用下面方式继承

        function SuperType() {
            this.colors = ["red", "blue", "green"];
        }
        function SubType() {
            SuperType.call(this);
        }
        SubType.prototype = Object.create(SuperType.prototype);
0

这个涉及到一个复杂值传递的问题,在js中数组属于object复杂数据类型,在赋值的过程中赋值给变量的是一个地址,
你把一个地址赋给一个变量,同时在变量中对地址所指向的数据进行了修改,那么这个数据就会被修改,在后面的过程中,你把这个地址再赋给其他变量
当然会得到已经发生改变的值。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
为什么会出现这种情况?
我新安装的oracle8i,执行语句select table_name from user_tables;rn怎么检索结果有50多个。这时候。我自己还没有建一个表哪。rn我想可能是设置的事吧,怎么设置才可以直显示真正是用户建的表?
为什么会出现这种情况
[code=java]class Resourcern String name;rn String sex;rnrnrnclass input implements Runnablern Resource r;rn rn public input(Resource r) rn super();rn this.r = r;rn rn rn public void run()rn int x=0;rn while(true)rn synchronized (r) rn if(x==0)rn r.name="Flank";rn r.sex="nan"; rn rn else rn r.name="诺娃";rn r.sex="女女女女女女";rn rn x=(x+1)%2; rn rn rn rnrnclass output implements Runnablern Resource r;rn rn public output(Resource r) rn super();rn this.r = r;rn rnrn public void run()rn while(true)rn //synchronized (r) rn System.out.println(r.name+"......."+r.sex);rn //rn rn rn rnrnrnpublic class ResourceDemo rn public static void main(String[] args) rn Resource r=new Resource();rn input in=new input(r);rn output out=new output(r);rn rn Thread t1=new Thread(in);rn Thread t2=new Thread(out);rn t1.start();rn t2.start();rn rnrnrn[/code]rnrn我知道如果output类里也把输出同步了进去,那么运行结果不会出现男女安全问题,可我把input类里同步了,那么就不会出现覆盖了姓名而不覆盖性别的情况,那为什么还会有安全问题呢?
为什么会出现这种情况??
你试试向一个新的二进制文件中写入0A然后看看写进去的是什么就行,也就是用stream打开一个文件,rnrnFILE *source=fopen(source file name, "r+b");rnrn然后随便用fputc(),fwrite()等等写入流的函数,随便写入整型的,字符的,长整的,只要里面任一个字节有0A(也就是10)在程序运行结束后就会变成0D0A,简直是神奇了。
急!!!为什么会出现这种情况??
下边是微分方程数值解的一个程序,要求求出数值解并作出函数图象rnrnrn double * Antic=new double[40];rn double * Euler=new double[40];rn Antic[0]=1;rn Euler[0]=1;rnrn for(int i=1;i<=40;i++)rn rn Antic[i]=(5-exp(-5.5*(i*0.1)))/5.5;rn rn for(int i=1;i<=40;i++)rn rn Euler[i]=Euler[i-1]-exp(-5.5*(i*0.1));rn rnrn但是每次编译的时候总是产生异常,或是被零除,或是内存越界,但是该程序在VC6 中能够编译通过,这是为什么那??rn
大家看看为什么会出现这种情况
#include "iostream"rnusing namespace std;rnstruct projectrn int number;//学号rn char name[10];//姓名rn int english;rn int math;rn int chinese;rn struct project *next;rn;rn//struct project people;rnproject *mycreat()rnrn int m;rn struct project* head;rn struct project *p,*q;rn head=(project*)new int(sizeof(project));rn q=head;rn cout<<"请输入学生的信息"<>m; //输入-1时退出rn while(m!=-1)rn rn rn p=(project*)new int(sizeof(project));rn q->next=p;rn p->number=m;rn cout<<"请输入学生的姓名"<>p->name;rn cout<<"请输入学生的英语成绩"<>p->english;rn cout<<"请输入学生的数学成绩"<>p->math;rn cout<<"请输入学生的语文成绩"<>p->chinese;rn cout<<"请输入学号"<>m;rn q=p;rn rn q->next=NULL;rn return head; rnrnvoid print(project *head)rnrn struct project *p;rn p=head->next;rn cout<<"输出学生的信息"<number<name<english<math<chinese<next;rn while(p!=NULL);rn rn rnrnvoid find(int m,project *head)rnrn project *p;rn p=head->next;rn if(p==NULL)rn rn cout<<"此链表为空"<number!=m)&&(p!=NULL))rn rn p=p->next;rn rn rn if(p==NULL)rn rn cout<<"没有查找的这个人"<number<chinese<english<math<name<>m;rn find(m,head);rn print(head);rn if(p!=NULL)rn rn p=p->next;rn delete []p;rn rnrn用VC编译结果是对的,但是aaaa.exe遇到问题需要关闭这样的问题
这种情况为什么会出现内存泄露
[code=C/C++]rnrntypedef struct STRDESCRIPTIONrnrn string strInfo1;rn string strInfo2;rn string strInfo3;rnSTRDESCRIPTION;rnrn//定义结构体对象rnSTRDESCRIPTION m_oDescription;rnrn//向结构体中赋值rnvoid MyParser::characterDataHandler(const char *text, size_t len) rnrn if(m_DCTag == DCTIT)rn rn strncpy((char *)m_oDescription.strInfo1.c_str(),text,len);rn rn else if(m_DCTag == DCCRE)rn rn strncpy((char *)m_oDescription.strInfo2.c_str(),text,len);rn rn else if(m_DCTag == DCSUB)rn rn strncpy((char *)m_oDescription.strInfo3.c_str(),text,len);rn rnrn[/code]rnrn上面的代码确实能够将text的内容传给结构体。但是现在出现了strInfo1正常,strInfo2也正常,strInfo3异常的情况。rn通过跟踪发现在strInfo2拷贝完后strInfo3也已经有了值,分析内存地址后发现:原来strInfo2的地址是70538而strInfo3的地址是70558,也就说strInfo2只能存放32个字节,而strInfo2的长度超过32个后就放入strInfo3里,异常发生。rnrn请问,我这样定义结构体为什么分配的内存是连续空间?rn解决方法我知道是使用string的append函数,但是为什么不能使用strncpy对指针进行操作?rn谁能帮我分析这样清楚产生的原因。
为什么VS 2010 会出现这种情况
[img=https://img-bbs.csdn.net/upload/201409/10/1410359349_515966.jpg][/img]
为什么会出现这种情况??“Table is ReadOnly”
我在程序重加入了一个Query1 ,然后设置其属性为RequestLive=True,下面是给Query1的SQl。Text赋值,rnsql.text:='select id as a,id1 as b,id2 as c id3 as d,name ,time from 表A'rn然后设置其属性为Active:=True,rn上面是在窗体的OnCreate 事件里面描述的,但是一执行这个Sql的时候,就出现,Table is readonly ,这个是什么问题呢??'
求教,为什么会出现这种情况
[img=https://img-bbs.csdn.net/upload/201612/22/1482373497_417421.png][/img]
不明白为什么会出现这种情况
#includernvoid Swap(char *vp1,char *vp2,int width)rnrn char tmp;rn if(vp1!=vp2)rn while(width--)rn tmp=*vp1;rn *vp1++=*vp2;rn *vp2++=tmp;rn rn rnrnint main()rnrn int array_a[]=1,2,3,4,5,78,88;rn int array_b[]=6,7,8,9,10,;rn int i;rn Swap((char*)array_a,(char*)array_b,sizeof(array_a));rn for(i=0;i
ajax提交为什么会出现这种情况?
就是在本页提交并且在本页显示 但是为什么提交后在本页把原来的内容都复制了一份显示出来?而且返回的明明只有$a变量啊 为什么会重复出现页面的内容呢?rn[img=https://img-bbs.csdn.net/upload/201702/26/1488073957_477749.png][/img]rn[img=https://img-bbs.csdn.net/upload/201702/26/1488073975_98529.png][/img]rn[code=php]rnrnrnrn rn rn rnrnrnrn提交rn rnrnrnrnrn[/code]
【求助】JS为什么会出现这种情况?
如图,我的疑问在图中描述的很清楚rn[img=https://img-bbs.csdn.net/upload/201710/28/1509161435_618491.png][/img]rn[img=https://img-bbs.csdn.net/upload/201710/28/1509161444_820644.png][/img]rn[img=https://img-bbs.csdn.net/upload/201710/28/1509161451_568043.png][/img]rn上图是第一个疑问:为什么 onclick=a( ); 和 onclick=function( ) a ( ) ;的效果会截然不同?rn[img=https://img-bbs.csdn.net/upload/201710/28/1509161470_589437.png][/img]rn这是第二个疑问,为什么在Dreamweaver 2017中这个错误无法消除?
为什么出现这种情况?
var x: bool;rnshowmessage(booltostr(false and x=false));rn为什么得出的是-1呢rn而false and (x=false)和false and false和x=false得出的数全为0呢。rn三个数全为false,怎么会得出-1呢。怪了。
为什么会出现这种情况呢?
SQL> select username from v$session;rnUSERNAMErn------------------------------rnrnrnrnrnrnrnSYSTEMrn已选择7行。rnSQL>rnrn上面的情况是怎么回事啊,只显示了了SYSTEM一个用户,但是系统却说选择了7行。rn
为什么会出现这种情况(串口通讯)?
unix下,串口数据接收程序,使用read函数来读取数据,发送方一次发送100左右字节数据,但接收程序不能一次接收完毕,而是分为几次来接收,每次只能读取4(/6/8/不等)字节数据,不知道为什么?
为什么会出现这种情况??高手帮忙!!
function window_onbeforeunload() rnif (window.confirm("确定要关闭吗?")==true)rnrnreturnrnrnrn在执行的时候,为什么在点了取消后,系统又弹出一个“确实要离开该页面吗?false 按确定继续,或按取消留在当前页面。”的提示信息??可以不要这个提示信息吗?直接点取消就可以了!
为什么会出现这种情况?关于动态链接库
ldd Testrnrn[color=#FF0000]libaprutil-1.so.0 => (file not found)[/color]rnlibapr-1.so.0 => /chenbo/ActiveMQ/lib//libapr-1.so.0rnlibrt.so.1 => /lib/librt.so.1rnlibcrypt_i.so.1 => /usr/lib/libcrypt_i.so.1rnlibpthread.so.1 => /lib/libpthread.so.1rnlibdl.so.1 => /lib/libdl.so.1rnlibexpat.so.0 => /usr/sfw/lib/libexpat.so.0rnlibstdc++.so.6 => /usr/sfw/lib/libstdc++.so.6rnlibm.so.2 => /lib/libm.so.2rnlibgcc_s.so.1 => /usr/sfw/lib/libgcc_s.so.1rnlibc.so.1 => /lib/libc.so.1rn[color=#FF0000]libaprutil-1.so.0 => /usr/local/aprutil//lib/libaprutil-1.so.0[/color]rnlibuuid.so.1 => /lib/libuuid.so.1rnlibsendfile.so.1 => /lib/libsendfile.so.1rnlibsocket.so.1 => /lib/libsocket.so.1rnlibnsl.so.1 => /lib/libnsl.so.1rnlibaio.so.1 => /lib/libaio.so.1rnlibmd5.so.1 => /lib/libmd5.so.1rnlibgen.so.1 => /lib/libgen.so.1rnlibmp.so.2 => /lib/libmp.so.2rnlibscf.so.1 => /lib/libscf.so.1rnlibdoor.so.1 => /lib/libdoor.so.1rnlibuutil.so.1 => /lib/libuutil.so.1rn/platform/SUNW,Sun-Fire-V490/lib/libc_psr.so.1rn/platform/SUNW,Sun-Fire-V490/lib/libmd5_psr.so.1rnrn注意红色标注部分,一个动态链接库为何会寻找两次,而且第二次寻找成功,第一次失败还会列出来?rn而且/usr/local/aprutil//lib/目录并不在LD_LIBRARY_PATH中,ldd是怎么找到该目录的呢?
编译时为什么会出现这种情况呢?
我在vc.net2003中编译我的程序,但却出现了编译错误,具体它是这样子说的:rn正在编译...rn文本查询系统.cpprnd:\学习与科技\作业\文本查询系统\文本查询系统.cpp(380) : fatal error C1010: 在查找预编译头指令时遇到意外的文件结尾rn这里:在查找预编译头指令时遇到意外的文件结尾是什么意思呢?是不是程序本身有问题呢?
为什么出现这种情况
Microsoft OLE DB Provider for ODBC Drivers 错误 '80004005' rnrn[Microsoft][ODBC SQL Server Driver][TCP/IP Sockets]SQL Server 不存在或访问被拒绝 rnrn/search/test.asp,行 48 rnrn我在更新数据库rn5000条左右就会出现这种情况怎么解决
为什么会出现这种情况啊?
Microsoft VBScript 编译器错误 错误 '800a03f6' rnrn缺少 'End' rnrn/iisHelp/common/500-100.asp,行242 rnrnMicrosoft OLE DB Provider for ODBC Drivers 错误 '80004005' rnrn[Microsoft][ODBC Microsoft Access Driver] 不能更新。数据库或对象为只读。 rnrn/test24/admin/AdminOption.asp,行16rnrnrn源码如下:rnif Request.Form("oldpassword")<>"" and Request.Form("newpassword")<>"" thenrn objRS.Open "SELECT admin,Pwd FROM admin",objDC,1,3rn if objRS("Pwd")=Request.Form("oldpassword") thenrn objRS("Pwd")=Request.Form("newpassword")rn objRS.Updatern
没有语法错误 为什么会出现这种情况
[code=c]rn/*求平均数*/rn# include rnrnint i = 0; j = 0;rnint c[2];rnint main()rnrn void aver(int b[2][2]);//声明rn int a[2][2];rn for (i = 0; i < 2; i++)rn for (j = 0; j < 2; j++)rn scanf("%d",&a[i][j]);//输入4个数字rnrn aver(a[2][2]);//调用rn for (i = 0; i < 2; i++)rn printf("%3d",c[i]);rnrn return 0;rnrnrnvoid aver(int b[2][2])rnrn int sum = 0;rn for (i = 0; i < 2; i++)rn rn for (j = 0; j < 2; j++)rn sum = sum + b[i][j];rn c[i] = sum/2;//求平均后赋值给c数组rn sum = 0;//归零rn rnrn[/code]rn[img=https://img-bbs.csdn.net/upload/201312/23/1387812344_760148.jpg][/img]rnrn先谢谢了!
为什么会产生这种情况
我访问某些普通网站时,会在该网页的上方的某个部分用英语提示我说我无权访问该网页,但是该网页的大部分区域却可以正常显示,但是如果该网页上有下载链接则无法接上.请问到底是什么原因,怎么解决.rn再就是如何使用FTP,我看了很多书也看不懂啊.rn最后就是我听说现在winamp可以放电影了,格式不清楚,有没有这回事啊
javascript的继承——原型链继承
原型链继承方式: Son.prototype = new Father(); 原型链继承的几个特点: 父类构造函数中的属性和方法都可以被子类继承; 父类原型上的属性和方法可以被继承; 父类实例上的属性和方法无法被继承; 父类构造函数中的属性和方法在所有子类实例中是共享的; 父类原型上的属性和方法在所有子类实例中是共享的; 创建子类实例时无法向父类构造函数传参(如果父类构造函数允许传参)。 下面...
为什么BDE出现这种情况?
我将SQL重装了。。。在此之前,我把一个数据库导成access,重装之后我将其恢复成sql,我用delphi的sql explorer连接这个数据库来运行程序时,程序提示不能识别,于是先看sql server。。。没有什么异常,数据能在我执行"!"操作时都显示出来!但是我换到BDE中打开Table点取一个表然后点其右边的"data"这时不能显示数据而是出现“invaild field type"为什么不能标识?我立刻查看了"text"发现表中的字段类型都不能正确显示出来而都是"null",这是为什么?sql 中没有一点错误只是做了一个连接呀?对了,我是的database driver name 是mssql!请行家指点!
widestring为什么出现这种情况?
procedure TForm1,Button1Click(sender:TObject)rnvar rn ws_1:widestring;rn ws_tmp_1,ws_tmp_2:widestring;rnbeginrn ws_1:='天气';rnrn ws_tmp_1:='';rn ws_tmp_2:='';rnrn ws_1:=ws_tmp_1 + ws_tmp_2;rn edit1.text:=ws_1;rnend;rnrn为什么edit1的内容显示'天气',而不是空?rnrn谢谢!!!
Javascript的原型、原型链、原型链继承
原型 在javascript中,原型分有两种:显示原型(prototype)和隐式原型(__proto__)。__proto__(隐式原型)JavaScript中任意对象都有一个内置属性`prototype`,在ES5之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过__proto__来访问。ES5中有了对于这个内置属性标准的Get方法Object.ge...
为什么会出现这种错误?
我用.net做的一个网站,安装在其它机器上都没问题,但今天安装到某台机器上时,一访问就出现以下错误提示:rnCompilation Error rnDescription: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. rnrnCompiler Error Message: CS0016: Could not write to output file 'c:\winnt\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\root\44290a9f\eb53159f\rr0rd5k9.dll' -- '拒绝访问。 'rnrn这还是在服务器上直接访问才能看到这个错误信息,要是用其它机器来访问,只能得到一个无法找到网页的提示。这是怎么回事啊?这台服务器是NTFS格式的,我把Microsoft.NET这个目录设为everyone都有写的权限也不管用。我另找一台NTFS的机器装了程序,也能正常访问的啊,不需要额外做什么设置。
为什么会出现这种问题
")rnEND SUBrnrn编译出错,认为前一个是结尾,后面的>") END SUB 都成了字符串,怎么办rnrn其实我就想启动一个新的IE,打开A.ASPX,并把SESSION("A")=ArnSESSION("B")=B传递给A.ASPX,rn有别的办法吗 rn
为什么会出现这种错误!!!
我new一个对象.rnHKMySql *m_ConnMysql;rnm_ConnMysql = new HKMySql();rnrn错误如下所示..为什么啊.rnrn正在链接...rnHKAAAManger.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall HKMySql::HKMySql(void)" (__imp_??0HKMySql@@QAE@XZ) ,该符号在函数 "public: void __thiscall HKAAAManger::Run(class std::basic_string,class std::allocator > const &)" (?Run@HKAAAManger@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用rnHKAAAManger.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall HKMySql::~HKMySql(void)" (__imp_??1HKMySql@@UAE@XZ) ,该符号在函数 "public: virtual void * __thiscall HKMySql::`scalar deleting destructor'(unsigned int)" (??_GHKMySql@@UAEPAXI@Z) 中被引用rn../bin/debug/HKRegister.exe : fatal error LNK1120: 2 个无法解析的外部命令rn
为什么会出现这种原因?
1。到win2k的登陆界面时,输入正确的密码后,显示出要进入的样子rn但出来的是:保存设置,然后就回到输入密码的界面了。rnrn2。我先装win98,然后装win2k(装在不同的分区里),这个时候可由win2k来rn引导。然后再装linux,装linux的分区没有击活,装完后,可以进入win2k和rnwin98。然后在win2k里面,把装linux的分区击活后,能用lilo引导起dos.rn但是选dos进入,选win98可以正常启动;选win2k后,出现rnrn因以下文件的损坏或丢失,Windows 2000无法启动。rn\system32\ntoskrnl.exe.rn请重新安装以上文件的拷贝。rnrn有谁可以告诉我产生上面的原因。rn多谢!(请仔细点。)rn
为什么会出现这种错误?
程序是这样的,rn服务器端:rn//listen函数rnint Server::Listenfunc()rnrn sockaddr_in local;rn SOCKET hsock;rnrn local.sin_family=AF_INET;rn local.sin_port=htons(m_iPort);rn local.sin_addr.S_un.S_addr=INADDR_ANY;rn hsock=socket(AF_INET,SOCK_STREAM,0);rn// ASSERT(hsock==NULL);rnrn int ret=bind(hsock,(LPSOCKADDR)&local,sizeof(local));rn if(ret==SOCKET_ERROR)rn rn CString err;rn err.Format("bind error: %d \n",WSAGetLastError());rn closesocket(hsock);rn return -1;rn rnrnrn char name[255];rn PHOSTENT hostinfo;rn if( gethostname ( name, sizeof(name)) == 0)rn rn if((hostinfo = gethostbyname(name)) != NULL)rn rn m_strAddr = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);rn rnrn rnrn ret=listen(hsock,100);rn if(ret==SOCKET_ERROR)rn rn CString err;rn err.Format("listen error: %d \n",WSAGetLastError());rn closesocket(hsock);rn return -2;rn rnrn struct sockaddr addr;rn CString strAddr;rn int addrlen;rnrn while(1)rn rn if(!m_bAllow)rn break;rnrn SOCKET s=accept(hsock,&addr,&addrlen);rn strAddr=addr.sa_data;rnrn AddUser(strAddr);//添加新连入的用户(IP唯一)rnrnrn ParamData pd;rn pd.server=this;rn pd.s=s;rn pd.addr=strAddr;rn DWORD dwThreadId; rn HANDLE hThread; rn //创建消息处理线程rn hThread = ::CreateThread(NULL, 0,analyzethread,(LPVOID) &pd,0, &dwThreadId); rn rn rnrn closesocket(hsock);rnrn return 0;rnrnrn//消息处理线程rnDWORD WINAPI analyzethread(LPVOID lparam)rnrn ParamData *pd=(ParamData *)lparam;rn CP2PServer *server=pd->server;rn rn server->AnalyzeMsg(pd->s,pd->addr);rnrn return 0;rnrnrn//消息处理函数:处理客户端发送过来的消息rnint Server::AnalyzeMsg(SOCKET s,CString addr)rnrn int ret;rn int count,i,pos=0;rn P2PMsg *pmsg;rn const int size=sizeof(P2PMsg);rn char buf[size];rn FileInfo *pflist;rnrn ret=recvn(s,buf,size);rn if(ret<0)rn rn DelUser(addr);rn closesocket(s);rn return -1;rn rnrn pmsg=(P2PMsg *)buf;rnrn switch(pmsg->type)rn rn case 0://获取共享文件信息rn AfxMessageBox("获取共享文件信息");rn count=GetFileCount();rn ret=sendn(s,(char *)&count,sizeof(int));//给客户发送文件数目rn if(ret<0)rn rn DelUser(addr);rn closesocket(s);rn return -1;rn rnrn pflist=new FileInfo[count];rn for(i=0;ifid,pmsg->seek,pmsg->len))rn rn DelUser(addr);rn closesocket(s);rn return -1;rn rn rn break;rnrn case 2://文件下载完成rn DelUser(addr);rn closesocket(s);rn break;rnrn default:rn break;rn rnrn return 0;rnrnrnrn客户端:rnrnint Client::GetFileList()rnrn sockaddr_in local;rn SOCKET s;rnrn local.sin_family=AF_INET;rn local.sin_addr.S_un.S_addr=inet_addr(m_strRemote);rn local.sin_port=htons(m_iPort);rnrn s=socket(AF_INET,SOCK_STREAM,0);rnrn int ret=connect(s,(LPSOCKADDR)&local,sizeof(local)); rn if(ret<0)//连接失败返回-1rn rn CString err;rn err.Format("Remote IP:%s,Error code:%d",m_strRemote,WSAGetLastError());rn AfxMessageBox(err);rn closesocket(s);rn return -1;rn rnrn //要发送的消息初始化rn P2PMsg msg;rn msg.fid=-1;rn msg.len=0;rn msg.seek=0;rn msg.type=0;//消息类型是0:获取文件清单rn rn //发送获取文件清单消息rn ret=sendn(s,(char *)&msg,sizeof(P2PMsg));rn if(ret<0)rn rn closesocket(s);rn return -1;rn rnrn int count;//文件数目rn ret=recvn(s,(char *)&count,sizeof(int));rn if(ret<0)rn rn closesocket(s);rn return -1;rn rnrn if(count<=0)//无共享文件rn rn closesocket(s);rn return -2;rn rnrn //接收文件清单rn FileInfo *pflist;rn pflist=new FileInfo[count];rn ret=recvn(s,(char *)pflist,count*sizeof(FileInfo));rn if(ret<0)rn rn closesocket(s);rn return -1;rn rnrn for(int i=0;i
为什么会出现这种错误
#include rnusing namespace std;rnvoid main()rnrn int x,y;rn char z;rn rn void initialize(int& x1, int& y1, char& z1);rn initialize(x,y,z);rn void initialize(int& x1, int& y1, char& z1)rn rn x1=0;rn y1=0;rn z1=' ';rn cout<
为什么会出现这种问题?
我的Linux的服务器在访问时,为什么会现:ForbiddenrnYou don't have permission to access / on this server.rnrnrn--------------------------------------------------------------------------------rnrnApache/1.3.12 Server at www.licherxxx.com Port 80rn是在局域网上测试的。rn
为什么会出现这种错误!
我在查询分析器中出现:查询中的表名太多。允许的最大数目为 256。
为什么会出现这种怪现象?
我们公司在使用一个用PB开发的使用SQL库的软件,每当客户端对数据库进行了几次操作后(增加、删除、查询等),就会死机,然后必须重启服务器才能解决问题,这种现象每隔几天就要发生一次,问题究竟出在哪里呢?
为什么会出现这种局面
从一个二本普通学校毕业,虽说学电子专业,但是毕业后才知道,别人学校学的我都没学,即使大家都学过的,我的水平那就是菜菜鸟。
为什么会出现这种结果?
我想做个例子,测试一下UTF的输出结果,我进行了下面的编程,结果除了奇怪的结果,谨请各位大虾帮忙解释一下,谢谢。rnrn try rnrn FileOutputStream aoFile = new FileOutputStream("c://test.txt");rnrn DataOutputStream poStream;rn poStream = new DataOutputStream(aoFile);rnrn String s = "FlexFloder";rnrn byte PREFIX_OF_OBJECT = 0x4C;rnrn poStream.writeByte(PREFIX_OF_OBJECT);rn poStream.writeUTF(s);rnrn poStream.flush();rn aoFile.close();rnrn poStream.close();rnrn catch (Exception e) rn System.out.println(e.getMessage());rn rn在文件c://test.txt中的信息换行了,不知道为什么?rn
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑