VS编译环境下C++语言出现的异常提示:烫烫烫烫烫烫烫烫烫烫的原因

“烫”常出现在Windows环境下,执行越界访问的程序,会打印出一很多连续的“烫烫烫…”,而0xcccc用汉语表示刚好就是“烫” oxcc正好是中断int 3的指令 起到保护作用。
首先,“烫”的GBK编码为“0xCCCC”。
其次,在x86系统中“0xCC”代表汇编指令”INT 3“的机器码。
INT 3解释:一个中断指令,例如设置软中断与这个指令相关,那么一段内存全是“CCCCCC…”,就会一直产生“烫”。
因为你字符串输出的时候,指针读取超过了本字符数组的结束 而不到下一个字符串的开始,指针指向就是这两个中间的位置 这些内存char值一般在VC里会是205,而两个字节的205连在一起,正好是汉字“烫”的代码。

  • 错误示例
void rs(void* par) {
    char buffer[1000];
    char add[] = "iamaserver";
    // I am a server
    SOCKET sock = (SOCKET)par;
    int size = recv(sock, buffer, sizeof(buffer), 0);
    cout << buffer<< endl;
    strcat(buffer, add);
    while (size > 0) {
         if (send(sock, buffer, size, 0) <= 0) {       // 客户端接收并显示信息时,会有多个“烫烫烫”
             break;
         }
         size= recv(sock, buffer, sizeof(buffer), 0);
    }
    closesocket(sock);
    return;
}

  • 运行截图

在这里插入图片描述

根据上文解释,可知,是在buffer数组后添加“iamserver”不成功,导致访问了值为null的数组元素,所以客户端接收时显示了一串“烫烫烫”

  • 解决办法
void rs(void* par) {
	char buffer[1000];
	 ==const char* add= " I am server";==
	SOCKET sock = (SOCKET)par;
	
	sockaddr_in client_addr;
	int addr_len = sizeof(client_addr);
	getpeername(sock, (struct sockaddr*)&client_addr, &addr_len);
	//cout << "\n客户端连接,端口号:" << ntohs(client_addr.sin_port) << "  客户端IP:" << inet_ntoa(client_addr.sin_addr) << endl;
	
	while (true) {
		int size = recv(sock, buffer, sizeof(buffer), 0);
		cout << "\n来自客户端 ["<< inet_ntoa(client_addr.sin_addr)<<"] - ["<< ntohs(client_addr.sin_port) << "] 的消息:" << buffer << endl;
		cout << "现在服务器连接了 " << flag << " 个客户端!"<<endl;
		if (strcmp(buffer, "bye bye") == 0) {
			cout << "客户端断开,退出线程!";
			flag = flag - 1;
			break;
		}
		==strcat(buffer, add);    //将add添加到buffer数组后==
		if (send(sock, buffer, strlen(buffer)+1, 0) <= 0) {
			flag = flag - 1;
			break;
		}
	
	}
	closesocket(sock);
	return;
}
  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓷瓷的可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值