LinuxSir.cn,穿越时空的Linuxsir!

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

菜鸟,第一天学linux编程就碰壁,谁能帮帮我

[复制链接]
发表于 2002-11-15 07:49:48 | 显示全部楼层 |阅读模式
小弟今天第一天学linux编程
结果书上一个简单的例程就通不过,这是一个简单的服务器的例子
下面是源代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>

#define SERVER_PORT 8003

void send_seq(int sockfd,int *data,int num_bytes)
{
        int net_data;
        net_data=htons(*data);
        write(sockfd,&net_data,num_bytes);
}

main()
{
        int sockfd;
        int connfd;
        int seq_data;
        int namelen;

        struct sockaddr_in *server_addr;
        //创建流式套接字
        sockfd=socket(AF_INET,SOCK_STREAM,0);
        if(sockfd<0)
        {
                fprint(stderr,"socket error!\n");
                exit(1);
        }

        server_addr->sin_family=AF_INET;
        server_addr->sin_addr.s_addr=INADDR_ANY;
        server_addr->sin_port=htons(SERVER_PORT);
        //将创建的套接字绑定在指定的端口上
        if(bind(sockfd,&server_addr,sizeof(server_addr))<0)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~大概是这里的参数有问题
        {
                fprint(stderr,"bind error!\n");
                exit(2);
        }
        //建立长度为2的监听队列,从套接字上收听连接请求
        if(listen(sockfd,2)<0)
        {
                fprintf(stderr,"listen error!\n");
                exit(3);
        }
        namelen=sizeof(server_addr);
        if((connfd=accept(sockfd,&server_addr,&namelen))<0)
        {
                fprintf(stderr,"accept error!\n");
                exit(4);
        }
        //此时连接已建立,可以进行通信
        for(seq_data=1;seq_data<=100;seq_data++)
        {
                send_seq(connfd,&seq_data,sizeof(int));
        }
        close(connfd);
}

出错信息如下:
server.c: In function `main':
server.c:37: warning: passing arg 2 of `bind' from incompatible pointer type
server.c:49: warning: passing arg 2 of `accept' from incompatible pointer type
/tmp/cc8FJH8f.o(.text+0x6f): In function `main':
: undefined reference to `fprint'
/tmp/cc8FJH8f.o(.text+0xd0): In function `main':
: undefined reference to `fprint'
collect2: ld returned 1 exit status
大概是bind和accept两个函数的参数有问题
我实在看不出来,请大虾赐教。
发表于 2002-11-15 09:41:26 | 显示全部楼层
if(bind(sockfd,&server_addr,sizeof(server_addr))<0)
改为:
if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct server_addr))<0)
试试。
if((connfd=accept(sockfd,&server_addr,&namelen))<0)
改为
if((connfd=accept(sockfd,(struct sockaddr *)&server_addr,&namelen))<0)
试试。
另外,这两句
fprint(stderr,"socket error!\n");
fprint(stderr,"bind error!\n");
应改为
fprintf(stderr,"socket error!\n");
fprintf(stderr,"bind error!\n");
不然链接将不成功。
发表于 2002-11-15 13:32:30 | 显示全部楼层
这个强制转换确实不能省,我查了一下,sockaddr类型在地址类型后是一个14字节的协议地址,他有可能为sockader_in也可能是sockaddr_un而这两种结构是不同的(协议族不同)
另外一个问题是INADDR_ANY需改成htonl(INADDR_ANY)
协议地址主要是端口号和IP地址,多余的添0我也是刚弄明白,如果改之后还有问题再贴出来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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