0

私は、Cで書かれた超基本的な「チャット」プログラムである1つのクライアント、1つのサーバーであったクラスからの古いプログラムを持っています。コードは以下のとおりです。現在、オングストローム (ARM チップ上で実行) 用にコンパイルしようとしていますが、これらのエラーが発生しています。オングストローム ツール チェーンをインストールしましたが、arm 用に作成された特別なバージョンの sys/socket.h (または別のヘッダー、読み取り/書き込み/クローズ関数が配置されているヘッダーを忘れた) などが必要ですか?

エラー:

~/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);
}
4

1 に答える 1

1

そのマニュアルページread(2)によると(またはman 2 read端末で入力)、必要なもの

 #include <unistd.h>

クロス開発ツール チェーンが、ターゲットシステムに関連する適切な unistd.hヘッダーを見つけるのに十分なほど適切に構成されていることを願っています。Ypu はクロスコンパイラに渡され、何が含まれているかを確認します。-H

-Wallそして、[cross-] コンパイラに渡すことを強くお勧めします (ほとんどすべての警告を取得するため)。

また、 accept(2)の man ページ (特にNOTESセクション)も考慮する必要があります。

于 2013-04-11T19:23:26.363 に答える