C语言TCP客户端服务端运行输入userid触发段错误问题咨询
段错误直接触发原因
客户端中char *code是未分配内存的野指针,你直接调用recv(sd,&code,100,0)往指针的内存地址写入100字节数据,严重越界破坏栈结构,这段逻辑在输入userid之前执行,栈被破坏后运行到scanf读取userid时就触发了段错误。
客户端需要修复的问题
- 所有字符指针
code/msg/filename都要分配足够内存,或者直接定义为字符数组,比如改为char code[100], msg[1024], filename[256];,禁止用未初始化的野指针接收数据 scanf("%s",&userid);去掉取地址符,改为scanf("%s", userid);,数组名本身就是首地址,加&会导致地址错误- 发送密码时
send(sd,password,sizeof(password),0);中password是指针,sizeof(password)只会取指针长度(4/8字节),改为send(sd, password, strlen(password)+1, 0);才能发送完整的密码字符串 recv函数的第二个参数直接传数组首地址即可,不要加取地址符,比如recv(sd, code, sizeof(code), 0);,之前的&code是取指针本身的地址,逻辑完全错误
服务端需要修复的问题
- 你调用
accept后返回的客户端通信套接字是ad,后续所有send/recv都要用ad,不能用监听套接字sd,比如send(ad,"220",strlen("220")+1,0);,用sd根本无法把数据发给客户端 - 变量
i未初始化,执行while(userid[i]!=' ')时i是随机值,会导致数组越界,定义时初始化为0:int i=0; id数组长度只有3,存储字符后没有手动加'\0'终止符,后续判断id[0]时可能读取到垃圾值,遍历结束后加id[i] = '\0';,或者把id定义为长度4的数组预留终止符位置- 调用
fopen后必须判断返回值,如果database.txt/studb.txt不存在会返回NULL,后续getline直接触发崩溃 - 发送字符串时不要硬编码100字节,改为
strlen(字符串)+1,避免发送多余的垃圾数据 getline的line指针建议初始化为NULL:char *line = NULL;,符合函数的调用规范
内容的提问来源于stack exchange,提问作者Vikneysh Raj G G A
相关产品推荐
相关产品推荐

