LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1385|回复: 2

小弟初学socket编程,recvfrom()函数出错,大侠请帮忙

[复制链接]
发表于 2005-4-2 20:30:52 | 显示全部楼层 |阅读模式
测试程序如下:
  #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>

#define SERV_PORT 8080
#define MAX_MSG_SIZE 1024
void udps_respon(int sockfd)
{
  struct sockaddr_in addr;
  int addrlen;
  int n;
  char msg[1024];
  char num_char[10];

  for(;;){
    /////////////////////////////////////////////////////////////////////////////////////////////
      /////////////////////recvfrom()函数
     n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen);
     if(n<0){
            fprintf(stderr,"recvfrom error:%s\n",strerror(errno));
            fputs(msg,stdout);
            }
   
        else{
             snprintf(num_char,10,"%d",strlen(msg));//conver the int to string!
             fputs(num_char,stdout);
             fputs("  chars   ->>recieved!\n",stdout);
             if(sendto(sockfd,msg,strlen(msg),0,
                         (struct sockaddr *)&addr,addrlen)<0)
                  {
                    fprintf(stderr,"send error : %s\n",strerror(errno));
                    exit(1);
                  }
            }
      ////////////////////////////////////////////////////////////////////////////////////////   
}
}
//----------------------------------------------------------------------------------------------
//main() begins here!!
int main()
{
  int sockfd;
  struct sockaddr_in addr;
  sockfd=socket(AF_INET,SOCK_DGRAM,0);//socket()
  if(sockfd<0){
     fprintf(stderr,"socket error!\n");
     exit(1);
    }
  bzero(&addr,sizeof(addr));//filled with zeros
  addr.sin_family=AF_INET;
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
  addr.sin_port=htons(SERV_PORT);

  if(bind(sockfd,(struct sockaddr *)&addr,sizeof(addr))<0){
     fprintf(stderr,"bind error!\n");
     exit(1);
     }//bind()

  udps_respon(sockfd);//called udps_respon()
  close(sockfd);
}


//------------------------------------------------------------------------------------------------


程序比较简单,就是接收udp数据包,然后将收到的信息返回给客户端;
用Gcc成功编译,但程序在执行recvfrom()后返回值为-1,errno 出错提示:Invalid argument,哪个参数错了呢?不过,事实上recvfrom 可以正常收到客户端提供的消息的.
   请高手帮忙!!
发表于 2005-4-2 23:12:50 | 显示全部楼层
addrlen 要事先赋值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-4 19:47:05 | 显示全部楼层

多谢了!问题解决了

哈哈 ,多谢大侠帮忙!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表