UDP通信,发送整形数据,接收不全
编译环境:vs2005
编程语言:C
我要用UDP进行数据通信,由于要发送的是整形数据,我把整形数据改成字符串的形式发送(试了直接发整形,收到的都是乱码),但是每个数 只能收到个位上的数。请教各位,这是什么原因?
客户端代码:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"wsock32.lib")
#pragma pack(1) //对齐
BOOL InitWinsock();
void main()
{
int i;
char buf[1024];
buf[0]='13';
buf[1]='56';
buf[2]='\0';
char buffer[1024]="\0";
strcpy(buffer,buf);
SOCKET socket1;
InitWinsock();
struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(6060); ///server的监听端口
server.sin_addr.s_addr=inet_addr("169.254.224.154"); ///server的地址
socket1=socket(AF_INET,SOCK_DGRAM,0);
i=0;
int sent;
sent=sendto(socket1,(const char *)&buf,sizeof(buf),0,(struct sockaddr*)&server,len);
printf("sent conditon is : %d\n",sent);
if (sent!=SOCKET_ERROR)
{
i++;
printf("send ok !");
}
else printf("send error:%u\n", WSAGetLastError());
Sleep(20);
printf("the num is : %d\n\n",i);
closesocket(socket1);
WSACleanup();
}
BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}
}
return TRUE;
}
服务器代码:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"wsock32.lib")
#pragma pack(1) //对齐
BOOL InitWinsock();
void main()
{
int i=0;
SOCKET socket1;
InitWinsock();
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(6060); ///监听端口
local.sin_addr.s_addr=htonl(INADDR_ANY); ///本机
socket1=socket(AF_INET,SOCK_DGRAM,0);
bind(socket1,(struct sockaddr*)&local,sizeof(sockaddr_in));
while (1)
{
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
int rev = 0;
printf("waiting for message from others-------------\n");
rev = recvfrom(socket1,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen);
buffer[rev] = '\0';
//MultiByteToWideChar(CP_ACP,0,buffer,-1,(LPWSTR)buf,10);
if (rev!=SOCKET_ERROR)
{
printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
i++;
}
else printf("rev error !\n");
printf("the num is : %d\n\n",i);
}
closesocket(socket1);
WSACleanup();
}
BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}
}
return TRUE;
}
分别运行上面两个程序,运行结果是:
服务器显示:
waiting for message from others-------------
Received datagram from 169.254.224.154--36
the num is :1
应该收到的是1356才对啊,这是怎么回事,困扰N天了,愁啊愁~~~~~~~~~
[解决办法]
printf("the num is : %d\n\n",i); //打印的i
关于i的代码只有
int i=0;
i++;
可以这样
客户端:
*(int*)buffer = 1356; //考虑字节序时为*(int*)buffer = htonl(1356)
服务端:
i = *(int*)buffer; //考虑字节序时为i = ntohl(*(int*)buffer)
[解决办法]
sent=sendto(socket1,(const char *)&buf,sizeof(buf),0,(struct sockaddr*)&server,len);
==>修改为
sent=sendto(socket1,(const char *)&buf,strlen(buf),0,(struct sockaddr*)&server,len);