2013-04-11 2 views
0

У меня есть старая программа из класса, которая была 1 клиентской, 1 серверной супер-основной программой чата в c, код ниже. Я пытаюсь скомпилировать его сейчас для angstrom (работает на чипе ARM), и я получаю эти ошибки. Я установил цепочку инструментов angstrom, мне нужны специальные версии sys/socket.h (или другой заголовок, забыли, в каком заголовке находятся функции чтения/записи/закрытия) и т. Д., Которые сделаны для руки?Arm Разработка программы клиентского сервера

Ошибка:

~/Desktop/test $ arm-angstrom-linux-gnueabi-g++ main.c -o main -lnsl 
main.c: In function 'int main()': 
main.c:66: error: invalid conversion from 'int*' to 'socklen_t*' 
main.c:66: error: initializing argument 3 of 'int accept(int, sockaddr*, socklen_t*)' 
main.c:75: error: 'read' was not declared in this scope 
main.c:77: error: 'write' was not declared in this scope 
main.c:79: error: 'close' was not declared in this scope 
main.c:81: error: 'unlink' was not declared in this scope 

Я непосредственно скопировал код из класса, так что первая ошибка может быть просто что-то глупо, но последняя пара говорит, что они не могут даже найти много функций, мне нужно ... но потом каким-то образом он распознает команду accept и говорит мне, что я использую неправильные аргументы:/Любые идеи?

Код:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> /* define socket */ 
#include <netinet/in.h> /* define internet socket */ 
#include <netdb.h>  /* define internet socket */ 

#define SERVER_PORT 9999  /* define a server port number */ 

int main() 
{ 
    int sd, ns, k; 
    struct sockaddr_in server_addr = { AF_INET, htons(SERVER_PORT) }; 
    struct sockaddr_in client_addr = { AF_INET }; 
    int client_len = sizeof(client_addr); 
    char buf[512], *host; 

    /* create a stream socket */ 
    if((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
    { 
    perror("server: socket failed"); 
    exit(1); 
    } 

    /* bind the socket to an internet port */ 
    if(bind(sd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) 
    { 
    perror("server: bind failed"); 
    exit(1); 
    } 

    /* listen for clients */ 
    if(listen(sd, 1) == -1) 
    { 
    perror("server: listen failed"); 
    exit(1); 
    } 

    printf("SERVER is listening for clients to establish a connection\n"); 

    if((ns = accept(sd, (struct sockaddr*)&client_addr, 
         &client_len)) == -1) 
    { 
     perror("server: accept failed"); 
     exit(1); 
    } 

    printf("accept() successful.. a client has connected! waiting for a message\n"); 

    /* data transfer on connected socket ns */ 
    while((k = read(ns, buf, sizeof(buf))) != 0) 
    { printf("SERVER RECEIVED: %s\n", buf); 
     write(ns, buf, k); 
    } 
    close(ns); 
    close(sd); 
    unlink(server_addr.sin_addr); 

    return(0); 
} 

ответ

1

По его странице руководства read(2) (или типа man 2 read на вашем терминале), Вам необходимо

#include <unistd.h> 

Я надеюсь, что ваша цепь инструмент кросс-разработки настроен достаточно хорошо чтобы найти справаunistd.h заголовок, релевантный вашему цель система. Ypu может передать -H вашему кросс-компилятору, чтобы проверить, что включено.

И я настоятельно рекомендую передать -Wall вашему [кросс-компилятору] (чтобы получить почти все предупреждения).

Вы также должны принять во внимание справочную страницу accept(2) (в частности, раздел NOTES).

Смежные вопросы