免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1509 | 回复: 3
打印 上一主题 下一主题

[网络] 求助个问题,关于UDP的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-18 16:17 |只看该作者 |倒序浏览
求助各位前辈个问题,小弟学些linux C语言,总计些了一个给予UDP的发送和接收端,发送和接收的数据是一个结构体,但是接收端接收不到结构体中的字符串成员,想来很久,也没有找出问题,麻烦各位前辈帮忙看看,帮助下我这个纯新手。
接收端代码如下:
#include"include.h"

#define port 9999
#define LENGTH 1024

struct str
{
  int type;
  char buff[LENGTH];
};

void rcv(int sock)
{
  struct sockaddr_in addr;
  int length,n;
  int running=1;
  struct str frame;
  char buffer[2000];
  while(running)
  {
    bzero(&frame,sizeof(struct str));
    length=sizeof(struct sockaddr);
    n=recvfrom(sock,(struct str*)&frame,LENGTH,0,(struct sockaddr *)&addr,&length);
    //memcpy(&frame,buffer,sizeof(struct str));
    printf("Server has recieved %s !\n",frame.buff);
    puts(frame.buff);
    printf("Server has recieved sending type %d !\n",frame.type);
  }
}

int main(void)
{
  int sock_fd;
  struct sockaddr_in addr;
  if((sock_fd=socket(AF_INET,SOCK_DGRAM,0))<0)
  {
    printf("Error in socket!\n");
    exit(1);
  }
  bzero(&addr,sizeof(struct sockaddr_in));
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  addr.sin_port=htons(port);
  if(bind(sock_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
  {
    printf("Error in bind!\n");
    exit(1);
  }
  rcv(sock_fd);
  close(sock_fd);
}

发送端代码如下:
#include"include.h"

#define port 9999
#define LENGTH 1024

struct str
{
  int type;
  int buff[LENGTH];
};

void snd(int sock)
{
  int n;
  struct sockaddr_in addr;
  struct str frame;
  char ipaddr[15];
  int running=1;
  char content[1200];
  while(running)
  {
    bzero(&frame,sizeof(struct str));
    bzero(&addr,sizeof(struct sockaddr_in));
    addr.sin_family=AF_INET;
    addr.sin_port=htons(port);
    printf("please input the ip address!\n");
    gets(ipaddr);
    if(inet_aton(ipaddr,&addr.sin_addr)<0)
    {
      printf("Ip error!\n");
      exit(1);
    }
    frame.type=5;
    printf("please input the content which you wanna send!\n");
    fgets((&frame)->buff,LENGTH,stdin);
    printf("aim ip is ");
    puts(ipaddr);
    printf("the content you wanna send is %s !\n",(&frame)->buff);
    printf("type is %d!\n",frame.type);
    n=sendto(sock,(struct str *)&frame,sizeof(&frame),0,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
    if(n<0)
    {
      printf("fail in sendto()\n");
      exit(1);
    }
    bzero(&frame,sizeof(struct str));
  }
}

int main(void)
{
  int sock_fd;
  if((sock_fd=(socket(AF_INET,SOCK_DGRAM,0)))<0)
  {
    printf("Error in socket()!\n");
    exit(1);
  }
  snd(sock_fd);
  close(sock_fd);
}

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2012-10-18 16:51 |只看该作者
n=recvfrom(sock,(struct str*)&frame,LENGTH,0,(struct sockaddr *)&addr,&length);

LENGTH = 1024, 但你的结构体很明显不止1024, 包被截断了.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
3 [报告]
发表于 2012-10-18 16:52 |只看该作者
struct str
{
  int type;
  int buff[LENGTH];
};

两边结构体都不一样.

论坛徽章:
0
4 [报告]
发表于 2012-10-19 15:12 |只看该作者
十分感谢,又犯低级错误了,数据类型都不一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP