2

iPhoneから送信するものを取得するのに苦労しています。このガイドに従いました最初は、プロトコルを変更してUDPおよびTCPに使用していると思っていたので、cfSocketRefから始めましたが、うまくいきませんでした。

これが BSD ソケットのコードです。何も送信されていないようです。localhost:port で待機している Java ソケット サーバーがあります。

何か案は?または、機能するガイド/サンプルのxcodeプロジェクトかもしれません。

    #import "ViewController.h"
    #include <CFNetwork/CFNetwork.h> //temp //dont leave here put it in a header
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    @interface ViewController ()

    @end

    @implementation ViewController


    static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
                               type, CFDataRef address, const void *data, void *userInfo)
    {
        NSLog(@"socketCallback called");
    }
    //

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        int sock = 0; /// ?
        unsigned int echolen;

        NSLog(@"starting udp testing");
        cfSocketRef = CFSocketCreate(/*CFAllocatorRef allocator*/       NULL,
                                     /*SInt32 protocolFamily*/          PF_INET,
                                     /*SInt32 socketType*/              SOCK_DGRAM,
                                     /*SInt32 protocol*/                IPPROTO_UDP,
                                     /*CFOptionFlags callBackTypes*/    kCFSocketAcceptCallBack | kCFSocketDataCallBack,
                                     /*CFSocketCallBack callout*/       (CFSocketCallBack)socketCallback,
                                     /*const CFSocketContext *context*/ NULL);



        struct sockaddr_in destination;
        memset(&destination, 0, sizeof(struct sockaddr_in));
        destination.sin_len = sizeof(struct sockaddr_in);
        destination.sin_family = AF_INET;

        NSString *ip = @"localhost";
        destination.sin_addr.s_addr = inet_addr([ip UTF8String]);
        destination.sin_port = htons(33033); //port


        NSString *msg = @"message sent from iPhone";
        /* server port */
        setsockopt(sock,
                       IPPROTO_IP,
                       IP_MULTICAST_IF,
                       &destination,
                       sizeof(destination));

        const char *cmsg = [msg UTF8String];

        echolen = strlen(cmsg);


        if (sendto(sock,
                   cmsg,
                    echolen,
                    0,
                    (struct sockaddr *) &destination,
                    sizeof(destination)) != echolen)
        {
            NSLog(@"did send");
        }
        else
        {
            NSLog(@"did not send");
        }


    }





    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end
4

1 に答える 1

3

最初の問題: ソケットを作成するのを忘れました:

if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
    NSLog(@"Failed to create socket, error=%s", strerror(errno));
}

この部分は機能しません:

NSString *ip = @"localhost";
destination.sin_addr.s_addr = inet_addr([ip UTF8String]);

inet_addr「127.0.0.1」などのドット表記で IPv4 アドレスを表す文字列を変換します。

「localhost」などのホスト名を IP アドレスに変換するにはgethostbyname、またはを使用する必要がありますgetaddrinfo(後者は IPv4 および IPv6 で機能します)。

の戻り値を確認すると、別のエラーがありますsendtosendto成功の場合は送信されたバイト数を返し、エラーの場合は (-1) を返します。したがって、次のようになります。

if (sendto(sock, ...) == -1) {
    NSLog(@"did not send, error=%s",strerror(errno));
} else {
    NSLog(@"did send");
}

の値を確認するとerrno、問題がすぐに明らかになります。ソケットの作成を忘れた場合のエラー メッセージは次のとおりです。

送信しませんでした。エラー = 非ソケットでのソケット操作

備考:

  • cfSocketRef関数では完全に使用されていません。
  • なぜIP_MULTICAST_IFソケットオプションを設定するのですか? 私の知る限り、これはユニキャスト メッセージには必要なく、マルチキャスト メッセージにのみ必要です。
于 2012-10-24T11:20:18.960 に答える