我用socket编写一个网络程序,用的是TCP/IP 协议,我认为socket发送的内容应该是安全的但是。
socket接受到的数据确是有乱码的。有时还接受不到。。这是为什么?
有什么解决的办法么?
以下是我写的一段代码。
int iSign = 3;
char * pSend = (char *)&iSign;
send(pMain->m_socketContent,pSend,sizeof(int),0);
iSign = 7;
send(pMain->m_socketContent,pSend,sizeof(int),0);
int retval = recv(sock,q,sizeof(int),0);;
if (iSign == 1)
{
int a;
char * data = (char *)&a;
UINT dw2 =recv(sock,data,sizeof(int),0);
dw2 =recv(sock,data,sizeof(int),0);
}...........
socket接受到的数据确是有乱码的。有时还接受不到。。这是为什么?
有什么解决的办法么?
以下是我写的一段代码。
int iSign = 3;
char * pSend = (char *)&iSign;
send(pMain->m_socketContent,pSend,sizeof(int),0);
iSign = 7;
send(pMain->m_socketContent,pSend,sizeof(int),0);
int retval = recv(sock,q,sizeof(int),0);;
if (iSign == 1)
{
int a;
char * data = (char *)&a;
UINT dw2 =recv(sock,data,sizeof(int),0);
dw2 =recv(sock,data,sizeof(int),0);
}...........
解决方案 »
- ocx控件对象不支持此属性或者方法
- 探求软件发展的未来!
- 怎样在父对话框中通过按钮销毁子对话框
- 求助,VC对话框中控件重绘缓慢!
- 如何将CListCtr中的某个ITEM设置为灰色?
- 见鬼了的问题
- 请问我如何写OnDraw函数使输出的图形不消失????
- 用C++Build调用VC写的DLL——————棘手问题,请进来看看!
- VC6.0下运行说内存出错,不能written,求高手指点迷津
- 在Dlg中,他的父窗口是什么?能用GetParentFrame得到吗?
- [高分请教] 用Winsock获取图片并动态显示到静态控件上 [高分请教]
- 如何取值GetItemText,每次任选第一行的但第一列值为何都是一样的。
这个我知道,现在程序能够接受到东西但是有时 char a = -52
是乱码,那我的数据到哪去了???????我不太明白
你该不会是没建立连接吧?
memset(szBuffer,0,5);
UINT n = recv(sock,szBuffer,sizeof(int),0);
int nResult = atoi(szBuffer);
试下 .
{
int SendRet,NeedSend = Length;
char *sending = Buf;
while(NeedSend){
SendRet = send(s,sending,NeedSend,0);
if (SendRet==SOCKET_ERROR) return false;//发送失败
if (!SendRet)return false;//连接断开
NeedSend -= SendRet;
sending += SendRet;
}
return true;//发送成功
}
int retval = recv(sock,q,sizeof(int),0);;
if (iSign == 1)
{
int a;
char * data = (char *)&a;
UINT dw2 =recv(sock,data,sizeof(int),0);
dw2 =recv(sock,data,sizeof(int),0);
}
//////////////////
我个人认为,接受数据有问题. 控制语句应该是多余的. 你可以一次全部接受完收据,也可以像你上面的只接受int长度的,但你发几个长度就接受多少长度的. 详细说明你要实现的功能.
{
}这个只是当中的一部分;
iSign代表的是不同的命令代号,根据不同的iSign再接受不同的数据
2.发数据前,把int型数据用htonl()函数转换后存入char数组,然后发送。
3.收到数据后,把收到的char数组前4个字节用ntohl()函数转换后复制给int型变量。
我传送一个名字char数组类型的,先传这个数组的长度,再根据长度传数组。但有时收到的就是一堆乱码这是为什么?
{
int RecvRet, iNeedRecv = NeedRecv;
char *recving = Buf;
RecvLength = 0;
while(iNeedRecv){
RecvRet = recv(s, recving, iNeedRecv, 0);
if(RecvRet == SOCKET_ERROR)
return false;//发送失败
if(!RecvRet)
return false;//连接断开
iNeedRecv -= RecvRet;
RecvLength += RecvRet;
recving += RecvRet;
}
return true;//发送成功
}
2.发数据前,把int型数据用htonl()函数转换后存入char数组,然后发送。
3.收到数据后,把收到的char数组前4个字节用ntohl()函数转换后复制给int型变量。
===============
网络字节序与主机字节序的问题,在应用协议层,只与接收和发送两端的主机系统有关系,从楼主贴的代码以及后面的文字看,问题并不在这里。
比如0x12345678。如果不做字符顺序转换处理,
你收到后会变成0x78563412。
1.发送方:
unsigned int iSign = htonl(3);
char * pSend = (char *)&iSign;
send(pMain-> m_socketContent,pSend,sizeof(int),0); 2.接收方:
unsigned int bufLen;
int retval = recv(sock,bufLen,sizeof(unsigned int),0);
bufLen = ntohl(bufLen);
{
int nRecvRet;
char *cRecving = Buf;
int iRcvData[MAXLEN] = {0};
nRecvRet = recv(s, cRecving , MAXLEN, 0); //长度比如为1024
if(nRecvRet == SOCKET_ERROR)
{
MessageBox("接受错误");
return 0;
}
if(!nRecvRet)
{
MessageBox("连接中断");
return 0;
} iRcvData = (int *)cRcving;
return iRcvData[NeedRecv];//接受成功
}
你发送数组长度的代码不对。
byHigh= HIBYTE(wRawData);
byLow= LOBYTE(wRawData);char * pSend;pSend[0] = byHigh;
pSend[1] = byLow;
send(pMain-> m_socketContent,pSend,sizeof(int),0);
iSign = 7;
send(pMain-> m_socketContent,pSend,sizeof(int),0);
if (iSign == 1)
{
int a;
char * data;
UINT dw2 =recv(sock,data,2,0);WORD wRawData = MAKEWORD(data[1], data[0]);
你发送数组长度的代码不对。”
char * data = (char *)&a;
不可以这样强制类型转换么?而且,如果这个出错的话,那应该是程序全部不行,但为什么我的程序有时正常,有时不正常呢?
比如你的发送方,先调用send发了一个1字节数据,
再调用send发一个4字节数据,
再调用send发一个500字节数据。
你的接受方调用recv收到的数据有多少,是不是把上面
3部分数据都收下来了,
怎么分割成你想要的3部分,需要你自己在代码里控制的。
接收的时候是char*类型,要sizeof(int)+1
if (iSign == 1)
{
int a;
char * data = (char *)&a;
UINT dw2 =recv(sock,data,sizeof(int),0);
dw2 =recv(sock,data,sizeof(int),0);
} ...........我想象的可能性:你并没有把保证发送的数据被全部正确接收。同一个连接里,你正常逻辑需要send了100,同时recv到100,但可能recv到60的时候程序出错,后续recv40的代码没有被执行,则剩余的40被留在下次recv时接收到,因此影响了下次的正常数据。