刚刚开始学习vc,在听孙鑫老师的视频教程,听到14课的网络编程时候,发现一个问题,就是我按照孙鑫老师讲的,也跟着他写的程序自己基本相当于又抄了一遍,抄在了新的文档中,但是当我运行服务器端程序的时候我发现在客户端程序还没有运行的时候服务器端就收到了数据,是一对乱码,不知道是什么原因阿??我把服务器端程序附在下面,请大家帮我这菜鸟看看!
#include<winsock2.h>
#include<iostream>
#include<studio.h>
using namespace std;int 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 socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN srvaddr;
srvaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(6000);
bind(socket,(SOCKADDR *)&srvaddr,sizeof(SOCKADDR));
char revbuf[100];
int len=sizeof(SOCKADDR);
SOCKADDR_IN clientaddr; recvfrom(socket,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
//cout<<revbuf;
printf("%s\n",revbuf); closesocket(socket);
WSACleanup();
}
#include<winsock2.h>
#include<iostream>
#include<studio.h>
using namespace std;int 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 socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN srvaddr;
srvaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(6000);
bind(socket,(SOCKADDR *)&srvaddr,sizeof(SOCKADDR));
char revbuf[100];
int len=sizeof(SOCKADDR);
SOCKADDR_IN clientaddr; recvfrom(socket,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
//cout<<revbuf;
printf("%s\n",revbuf); closesocket(socket);
WSACleanup();
}
解决方案 »
- 单文档中,MouseMove函数,Point.y的值是乱的?
- 扩展DLL传递结构体的问题请教
- 对数据库进行select出现异常(高手进来一下)
- List中高亮显示问题
- 怎样使formview中list control中的数据能够分页显示(由于数据量太大)?
- 在当前进程中如果要给其它某一进程的某一线程安装钩子,钩子是不是也得在dll中?
- 本人改行---VC++书籍超低价处理
- 请问,用DrawText如何上下左右都居中,同时还能自动换行?谢谢啦,急急急呀
- 有应用过netmeeting sdk的朋友请和我联系,我们一起赚钱
- listctrl控件不显示数据,帮帮忙,有酬谢!
- 问个关于ARP协议的常识问题
- 关于阻塞函数超时处理的解决方案!!!(剩的分全在这)
还有你这样输出接收到的字符串肯定是乱码
其实你没有收到数据,你加个变量判断recvfrom返回的值就行
int ret=recvfrom(socket,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
if(ret>0)printf("%s\n",revbuf);
这样就不会出现打印语句了,除非收到数据
如果不初始化recbuf,它里面就是一些默认值,打印出来就是乱码
可以使用memset(recbuf,0,sizeof(revbuf)); 将它初始化为0
>0 才打印
疯了
在就是刚刚我写的初始化语句写错了,改正如下
memset(revbuf,0,sizeof(revbuf));
#include<winsock2.h>
#include<iostream>
#include<stdio.h>
using namespace std;int 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 socketsrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN srvaddr;
srvaddr.sin_addr.S_un.S_addr=inet_addr("192.168.0.22");
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(4001);
bind(socketsrv,(SOCKADDR *)&srvaddr,sizeof(SOCKADDR));
char revbuf[100];
int len=sizeof(SOCKADDR);
SOCKADDR_IN clientaddr;
//memset(revbuf,0,sizeof(revbuf));
//recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
/* int ret=0;
do
{
ret=recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
}while(ret<=0);*/
//cout<<revbuf;
int ret=recvfrom(socketsrv,revbuf,100,0,(SOCKADDR *)&clientaddr,&len);
if(ret>0)
{
printf("%s\n",revbuf); }
closesocket(socketsrv);
WSACleanup();
}