aavivian 发表于 2012-10-18 16:17

求助个问题,关于UDP的

求助各位前辈个问题,小弟学些linux C语言,总计些了一个给予UDP的发送和接收端,发送和接收的数据是一个结构体,但是接收端接收不到结构体中的字符串成员,想来很久,也没有找出问题,麻烦各位前辈帮忙看看,帮助下我这个纯新手。
接收端代码如下:
#include"include.h"

#define port 9999
#define LENGTH 1024

struct str
{
int type;
char buff;
};

void rcv(int sock)
{
struct sockaddr_in addr;
int length,n;
int running=1;
struct str frame;
char buffer;
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;
};

void snd(int sock)
{
int n;
struct sockaddr_in addr;
struct str frame;
char ipaddr;
int running=1;
char content;
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);
}

linux_c_py_php 发表于 2012-10-18 16:51

n=recvfrom(sock,(struct str*)&frame,LENGTH,0,(struct sockaddr *)&addr,&length);

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

linux_c_py_php 发表于 2012-10-18 16:52

struct str
{
int type;
int buff;
};

两边结构体都不一样.

aavivian 发表于 2012-10-19 15:12

:dizzy:十分感谢,又犯低级错误了,数据类型都不一样
页: [1]
查看完整版本: 求助个问题,关于UDP的