免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: berryfly
打印 上一主题 下一主题

求救!!:关于UNIX系统UDP编程问题 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2005-11-02 11:22 |只看该作者
你的程序我编译了一下,排除语法错误后可以生成OBJ文件,但是还是在生成EXE文件时出错了,现在把错误提示和我修改过的程序发给你,能再帮我看看吗?
   好象是系统无法识别FDZERO、FDSET、FDISSET,不知道这三个函数有什么作用?你运行修改后的程序,能达到正确接收并显示数值的目的吗?再次感谢!!!
void udps_respon(int sockfd)
{
       struct        sockaddr_in addr;
       int                n,ret;
       socklen_t        addrlen;
       char                msg[MAX_MSG_SIZE];
       struct        timeval tv;
           fd_set        rdset;
       while(1)
       {       /* 从网络上读,写到网络上面去   */
                   tv.tv_sec  = 1;
                   tv.tv_usec = 0;

                   FDZERO(&rdset);
                   FDSET(sockfd,&rdset);
                       
                   ret = select(sockfd+1,&rdset,NULL,NULL,&tv);
                   if(ret == -1)
                   {
                           printf("select error %s\n ",strerror(errno));
                           exit(-1);
                   }
                   if(ret == 0)
                   {
                           printf("select timeout, continue cricle\n");
                           continue;
                   }
                  
                   if(FDISSET(sockfd,&rdset))
                   {
                                                           memset(msg, 0, sizeof(msg));
                               addrlen = sizeof(struct sockaddr);
                               n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,
                       (struct sockaddr*)&addr,&addrlen);
                                if(!strcmp(msg,"quit")||!strcmp(msg,"QUIT"))
                                {
                                        printf("recv end\n");
                                        close(sockfd);
                                        exit(1);
                                }
               /* 显示服务端已经收到了信息  */
                                msg[n] = 0;   /*清空mesg中的存放数据*/
                                fprintf(stdout,"I have received %s",msg);
                                sendto(sockfd,msg,n,0,(struct sockaddr*)&addr,addrlen);
                   }
       }
}

[ 本帖最后由 berryfly 于 2005-11-2 11:25 编辑 ]

未标题-2.gif (16.63 KB, 下载次数: 32)

未标题-2.gif

论坛徽章:
0
52 [报告]
发表于 2005-11-02 11:45 |只看该作者
原帖由 berryfly 于 2005-11-2 11:22 发表
你的程序我编译了一下,排除语法错误后可以生成OBJ文件,但是还是在生成EXE文件时出错了,现在把错误提示和我修改过的程序发给你,能再帮我看看吗?
   好象是系统无法识别FDZERO、FDSET、FDISSET,不知道这三个 ...

FD_ZERO()
FD_SET();
FD_ISSET();
不好意思,笔误,我没调试:)。

论坛徽章:
0
53 [报告]
发表于 2005-11-03 15:32 |只看该作者
再次麻烦你!
现在确定下来,client端发过来的包是个结构体,
struct Send
                {
                        float x;  //发送10.0000
                        float y;  //发送20.0000
                        float z;  //发送30.0000
                }m_Send;

我把server程序改成接收这个结构体的了,程序运行后,n=recvfrom(。。。。);
后n一直是大于0,应该是能接收到包对吧?
但我printf("m_Recv.x= %f",m_Recv.x);
      printf("m_Recv.y= %f",m_Recv.y);
      printf("m_Recv.z= %f",m_Recv.z);  结果m_Recy.x=0.000000;
m_Recy.y=0.000000;m_Recy.z=0.000000;也就是没有取到接收到的数据。

能帮我查查程序哪里错了吗?尤其是recvfrom函数,我一直这里很糊涂。
我好着急呀!!!!!!能帮我好好查查吗??????????

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#include <sys/select.h>
#include <sys/time.h>

#define SERVER_PORT     1500
#define MAX_MSG_SIZE    1024

void udps_respon(int sockfd)
{
       struct sockaddr_in addr;
       int    n,ret;
       socklen_t addrlen;
       struct        timeval tv;
           fd_set        rdset;
           struct RECV
                {
                        float x;
                        float y;
                        float z;
                }m_Recv;

       while(1)
       {     
                   tv.tv_sec  = 1;
                   tv.tv_usec = 0;

                   FD_ZERO(&rdset);
                   FD_SET(sockfd,&rdset);
                       
                   ret = select(sockfd+1,&rdset,NULL,NULL,&tv);
                   if(ret == -1)
                   {
                           printf("select error %s\n ",strerror(errno));
                           exit(-1);
                   }
                   if(ret == 0)
                   {
                           printf("select timeout, continue cricle\n";
                           continue;
                   }
                    
                  
                    if(FD_ISSET(sockfd,&rdset))
                   {
                   /* 从网络上读,写到网络上面去   */
                               memset(&m_Recv, 0, sizeof(&m_Recv));
                               addrlen = sizeof(struct sockaddr);
                               n=recvfrom(sockfd,&m_Recv,MAX_MSG_SIZE,0,
                       (struct sockaddr*)&addr,&addrlen);
                                                          if(n <= 0)
                               {
                                       fprintf(stderr, "Recv Error %s\n", strerror(errno));
                                       return;
                               }
                                                          else
                                                          {
               /* 显示服务端已经收到了信息  */
                                                          
               printf("m_Recv.x= %f",m_Recv.x);
                           printf("m_Recv.y= %f",m_Recv.y);
                           printf("m_Recv.z= %f",m_Recv.z);
                                                          }

                        }
       }
}

int main(void)
{
       int sockfd;
       struct sockaddr_in      addr;
        
       sockfd=socket(AF_INET,SOCK_DGRAM,0);
       if(sockfd<0)
       {
               fprintf(stderr,"Socket Error:%s\n",strerror(errno));
               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(SERVER_PORT);
       if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)
       {
               fprintf(stderr,"Bind Error:%s\n",strerror(errno));
               exit(1);
       }
       udps_respon(sockfd);
       close(sockfd);
}

[ 本帖最后由 berryfly 于 2005-11-3 15:34 编辑 ]

论坛徽章:
0
54 [报告]
发表于 2005-11-03 15:48 |只看该作者
好 看来我的猜想没有错!问题好象就是出在了你的客户端上。fread和fwrite 是格式化读写函数,所以他们发送的结构体信息到了你的服务器端就成了乱码
修改:
open("file",O_RDONLY);

rlen = read(sockfd,buf,sizeof(buf));

sendto(sockfd,....);

论坛徽章:
0
55 [报告]
发表于 2005-11-03 16:59 |只看该作者
错了,错了,是新问题了,:)
以前client传的是char
今天client传的是结构体了,仔细看一下我上个贴,拜托好好帮我查查,我现在是接收不到结构体里的数据。非常感谢!!!!!
我要走了,网吧要关门了!!!!
拜托呀!!!!!!!!!!!!!!!!!!!!!!!!!!!

论坛徽章:
0
56 [报告]
发表于 2005-11-04 10:06 |只看该作者
今天早晨将结构体里的float型改为char 型,接收端做同样的改动,结果是可以接收到结构体的,结构体改为int型就不能正确接收了?int型和float型都不能正确接收,为什么呢?

论坛徽章:
0
57 [报告]
发表于 2005-11-04 14:11 |只看该作者
搞定了,哈哈!!谢谢你这段时间的支持,再次感谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP