关于乱码

woshidiannaomang 2010-04-21 10:31:39
#include <WINSOCK2.H>
#include <stdio.h>

int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {

return 1;
}



if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );
return 1;
}

SOCKET socketSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(socketSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char revBuf[100];
char sendBuf[100];
char temBuf[200];

SOCKADDR_IN addClient;
int len=sizeof(SOCKADDR);
while (1)
{
recvfrom(socketSrv,revBuf,100,0,(SOCKADDR*)&addClient,&len);

if ('q'==revBuf[0])
{
sendto(socketSrv,"q",strlen("q")+1,0
,(SOCKADDR*)&addClient,len);
printf("chat end!\n");
break;
}

//revBuf[strlen(revBuf)]='\0';
sprintf(temBuf,"%s say:%s",inet_ntoa(addClient.sin_addr),revBuf);
printf("%s\n",temBuf);

printf("please enter:\n");
gets(sendBuf);
sendto(socketSrv,sendBuf,strlen(sendBuf)+1,0
,(SOCKADDR*)&addClient,len);
//closesocket(socketSrv);

}
closesocket(socketSrv);
WSACleanup();
return 0;
}

代码如上 ,测试出现乱码“烫烫烫烫烫烫”!奇怪的是偶尔又不出现乱码!程序运行正常!
请好心人帮忙分析下原因!
...全文
280 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
尹成 2010-04-25
  • 打赏
  • 举报
回复
char[]必须用unicode处理,才不会出现乱码,
编码解码要一致
woshidiannaomang 2010-04-25
  • 打赏
  • 举报
回复
感谢yaozhiyong110
Eleven 2010-04-25
  • 打赏
  • 举报
回复
数组初始化一下。。。
woshidiannaomang 2010-04-24
  • 打赏
  • 举报
回复
感谢yaozhiyong110!的确是这种情况!
断网就能正常运行!请问下 怎么解决这个问题?
yaozhiyong110 2010-04-24
  • 打赏
  • 举报
回复
你非要接收你客户端的信息的话 接收的时候可以判断下是不是客户端发来的
怎么判断需要你自己设计 如果不是客户端发来的 那你可以选择丢弃 根据这个addClient
就可以知道是不是你的客户端 或者根据recvfrom的返回值 返回的是正确发送的字节数
发现为0那就说明没有发送成功 那么继续recvfrom直到你的饿客户端发来消息为至

整个过程你可以随心所欲的控制 看你自己想怎样
yaozhiyong110 2010-04-23
  • 打赏
  • 举报
回复
你可以断网 测试测试 或者保证你的机子没数据来 网线拔了测试下就知道了
yaozhiyong110 2010-04-23
  • 打赏
  • 举报
回复
你这个程序 运行的时候 要保证 本机没有其他数据来 只有你的客户端会向你发消息!

比方说 如果你连网了(或有其他机子给你发消息了) 你程序开的时候 网络有数据传过来
你的程序就接收了 所以就显示“本机IP say:”和“please enter:” 这个结果

然后你输入的内容 发向了 某个网络 这时候 某个网络会像你客户端设计的那样接受你的内容?

所以就一直在等某个网络接收消息喽(这就是你说的不正常工作)

当然运气好 没其他数据过来 那么你再打开客户端就是正常运行了(这就是你说的正常工作)
woshidiannaomang 2010-04-23
  • 打赏
  • 举报
回复
是的 初始化数组这个的确可以解决乱码问题。但是问题是收不到客户端程序发送过来的信息 。这个服务程序向客户端发送信息的时候一直循环 客户端也收不到!

上面程序运行正常情况下应该是程序一启动 控制台应该是什么字符也没有!然后客户端发送数据过来 才显示客户端发送的数据。

而现在是一开始就显示“本机IP say:”和“please enter:” 这个结果!然后在控制台输入数据试图向客户端发送数据却一直循环输入 数据也发不出去!客户端发过来的数据也收不到。
奇怪的是 有时关闭VC6.0后然后再打开工程运行这个程序却又能正常工作!不管有没有做上面的数据初始化都能正常工作!也不会出现乱码!这个是不是VC6.0编译器本身的问题?

还有这个的却是孙鑫的例 但是孙鑫就没有初始化 !我想他的程序多跑几次应该还是会出现这个问题吧!这个多跑几次偶尔会正常 !
sjdev 2010-04-21
  • 打赏
  • 举报
回复
你这是发送端,出现的“烫烫烫烫烫烫”并不是乱码,是你的char[]没初始化。

另外,“烫烫烫烫烫烫”在什么地方出现的?对应哪里的代码?
alicktony 2010-04-21
  • 打赏
  • 举报
回复
可以把数组初值设为零试试,另外如果我没有记错的话这应该是孙鑫书上的一道例题吧。你可以好好比较一下呗

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧