未定义的引用`writen'

时间:2016-05-12 09:42:28

标签: c sockets linker serversocket

我正在学习套接字编程,目前正在研究ECHO服务器代码。我收到了这些错误:

  

serverecho.c :(。text + 0x173):未定义引用'写入'
  serverecho.c :(。text + 0x180):未定义引用' print'

编译时

。我不确定我在这方面做错了什么。我的代码如下:

#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;
    pid_t childpid;
    socklen_t len;
    char buff[MAXLINE];
    struct sockaddr_in servaddr, cliaddr;

    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));
        if ((childpid=fork())==0)
        {   
            close(roockfd);
            echoserv(confd);
            exit(0);
        }

        close(confd);
    }
}

echoserv(int sockfd)   /* echoserv function */
{
    ssize_t n;
    char buff[MAXLINE];

again :
    while((n=read(sockfd,buff,MAXLINE)>0))
        writen(sockfd,buff,n);

        if(n<0)
            print("Error while reading");
}

使用gcc编译时出错:

  

root @ kali:〜/ Desktop / cprogs #gcc serverecho.c -o serverecho.out -lm       /tmp/ccWL7GLc.o:在功能&#39; echoserv&#39;:
      serverecho.c :(。text + 0x173):未定义引用&#39; writen&#39;
      serverecho.c :(。text + 0x1b9):未定义引用&#39; print&#39;
      collect2:错误:ld返回1退出状态

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些拼写错误。而不是writen使用write而不是print使用printf。如果您没有引用这些函数,请确保正确包含它们,以便编译器知道在哪里找到它们。

答案 1 :(得分:0)

使用此:

write(sockfd,buff,n);

因为writen不是C语言中的预定义函数。所以,当你编译程序时,你会得到一个未定义的引用`writen&#39;。

也可以printf("Error while reading");代替print()