内置函数bzero的隐式声明不兼容

时间:2016-05-10 04:01:23

标签: c linux sockets

我是c编程的新手,我目前正在尝试理解网络编程的概念。有一个简单的服务器代码,我试图在Kali linux(基于Debian的Linux系统)上运行但是有一些我无法调试的错误。请看一下我的代码。

代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <stdlib.h>


#define SA  struct sockaddr
#define MAXLINE 4096

int main(int argc,int **argv)
{
    int roockfd,confd;
    socklen_t len;
    struct sockaddr_in servaddr,cliaddr;
    char buff[MAXLINE];
    time_t ticks;

    roockfd = socket(AF_INET,SOCK_STREAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);

    Bind(roockfd,(SA*)&servaddr,sizeof(servaddr));

    Listen(roockfd,5);

    for(; ;)            
    {
        len=sizeof(cliaddr);

        confd= Accept(roockfd,(SA*)&cliaddr,&len);
        printf("Connection from %s, port %d\n",
            Inet_ntop(AF_INET,&cliaddr.sin_addr,buff,sizeof(buff)),
            ntohs(cliaddr.sin_port));

        ticks=time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n", ctime(ticks));
        printf(confd,buff,strlen(buff));
        close(confd);
    }
}

等待您的宝贵回应。

2 个答案:

答案 0 :(得分:3)

有几个错误:

  1. 要使用bzero,请在文件中加入#include <strings.h>。请注意bzero是BSD中使用的过时函数,您应该考虑使用memset(&servaddr, 0, sizeof(servaddr))
  2. 函数BindListenInet_ntopAccept不是标准套接字函数,要么错误地将它们大写,如果是这种情况,请更改为{ {1}},bindlisteninet_ntop。或者它们是套接字接口的自定义包装器,如果是这种情况,请在文件中包含相应的标头。

答案 1 :(得分:3)

这是编译的代码的一个版本。请将其与原始版本进行比较,并尝试了解更改。我同意@ fluter的建议。要编译它还需要更多的东西。但是,我无法验证其操作或行为。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

#define SA  struct sockaddr
#define MAXLINE 4096

int main(int argc, char *argv[])
{
    int roockfd, confd;
    socklen_t len;
    struct sockaddr_in servaddr, cliaddr;
    char buff[MAXLINE];
    time_t ticks;

    roockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(roockfd, (SA *)&servaddr, sizeof(servaddr));

    listen(roockfd, 5);

    for (; ;) {
        len = sizeof(cliaddr);

        confd = accept(roockfd, (SA *)&cliaddr, &len);
        printf("Connection from %s, port %d\n",
               inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),
               ntohs(cliaddr.sin_port));

        ticks = time(NULL);
        snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
        write(confd, buff, strlen(buff));
        close(confd);
    }
}