1

個人的な練習として、C++ で Linux 用のさらに別のソケット ライブラリに取り組んでいます。これが私のコードです:

#ifndef SOCKET_H
#define SOCKET_H

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

/**
 * Creates a struct to hold all the necessary information to create a socket.<br/>
 * Typically, you should not need to call this yourself, as it is done when you     call         listen() or dial()
 * @param host The hostname or IP address to connect to.
 * @param service The service on that machine (e.g "http" or "80")
 * @param sock The type of socket ("tcp" or "udp")
 * @return A addrinfo struct with all the required information to create a connection.
 */
addrinfo setup(const char *host,const char *service,const char *sock) {
    struct addrinfo hints;
    struct addrinfo *serv;
cout << "2.call to setup()\n";
//cout << "3.setup() returns here.\n";
//return *serv;
    int status=0;
/*struct addrinfo hints;
    struct addrinfo *serv;*/

    memset(&hints,0,sizeof hints);
    hints.ai_family=AF_UNSPEC;
    if (sock=="tcp") {
    hints.ai_socktype=SOCK_STREAM;
    } else if (sock=="udp") {
        hints.ai_socktype=SOCK_DGRAM;
    } else {
        fprintf(stderr,"[!] xsockets: error: unknown socket type %s\n",sock);
        exit(2);
    }
    hints.ai_flags=AI_PASSIVE;

    if ((status=getaddrinfo(host,service,&hints,&serv))!=0) {
        fprintf(stderr, "[!] xsockets: error: getaddrinfo error: %s\n",     gai_strerror(status));
        exit(1);
    }
    cout << "3.setup() returns here.\n";
    return *serv;
}

/**
 * Listens on a portand returns a scoket file descriptor.
 * @param service The service on this machine (e.g "http" or "80")
 * @param sock The type of socket ("tcp" or "udp")
 * @return A socket filde descriptor.
 */
int listen(const char *service,const char *sock) {
    cout << "1.call to listen()\n";
    struct addrinfo *serv;
    *serv=setup(NULL,service,sock);
    cout << "4.is this ever called?";
    int sockfd=socket(serv->ai_family,serv->ai_socktype,serv->ai_protocol);
    int status=bind(sockfd,serv->ai_addr,serv->ai_addrlen);
    if (status!=0) {
        fprintf(stderr,"[!] xsockets: error: bind error:                         %s\n",gai_strerror(status));
        exit(3);
}
    cout << "5.listen() returns here.";
    return sockfd;
}
#endif

これを実行すると、#3「setup() がここに戻る」までは到達しますが、#4「これは呼び出されたことがありますか?」には到達しません。はるかに少ない#5「listen()がここに戻る」

誰が何がうまくいかなかったのか教えてもらえますか。

私はUbuntu Linuxを使用しており、これをルート権限で実行しています。g++コマンドでコンパイルしました。

ここに私が得ているものがあります:

4

2 に答える 2

3

ポインタを初期化せずservにすぐに逆参照するため、未定義の動作があります*serv

それにもかかわらず、デバッグしているときは、std::flushまたはstd::endlに挿入して出力がフラッシュされることを確認する必要がありstd::coutます。

cout << "4.is this ever called?" << std::endl;
于 2013-04-20T22:08:48.450 に答える
2

いくつかの基本的な問題があります。

  1. にメモリを割り当てませんserv

    struct addrinfo *serv;

    *serv=setup(NULL,service,sock);

  2. ほとんどの関数の戻り値をチェックしませんint sockfd

  3. グローバルではなくスタックで宣言し、各変数のスコープを把握してみてください。

    struct addrinfo hints;
    struct addrinfo *serv;
    
于 2013-04-20T22:10:43.747 に答える