1

ネットワーク内のサーバーにリクエストを送信したいと考えています。最初にしたことは、自分の IP アドレスを取得することでした。元。196.168.16. * . IP アドレスを取得したので、リスニング ポートを持つネットワーク内のすべての IP にリクエストを送信する必要があります。ポート 49160。だから私がしたことは、192.168.16.1 から 192.168.16.255 にリクエストを送信することでした。IP に 49160 のリッスン ポートがある場合、それらは私のリクエストを受け取ります。次に、PCにプロンプ​​トが表示されます...ちなみに、私のサーバーはPCです..その後、PCユーザーはそれを受け入れ、私は彼らからの返信メッセージを受け取ります. 静的な方法でリクエストを送信できますが、メソッドをループしようとすると、それを使用して機能しません。

サンプルコードは次のとおりです。

static IOStreamHelper *_sharedInstance = nil;

+ (IOStreamHelper*)sharedInstance
{
    if (_sharedInstance == nil) {
        _sharedInstance = [[IOStreamHelper alloc] init];
    }
    return _sharedInstance;
}


-(void)initWithIpAddress:(CFStringRef)ipAddr port:(int)port
{

NSString*str = (__bridge_transfer NSString*)ipAddr;
NSLog(@"initWithIP:%@:%i",str,port);
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)ipAddr, port, &readStream, &writeStream);

inputStream = (__bridge_transfer NSInputStream *)readStream;
outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}


-(void)sendStringRequest
{
    NSString*space = [NSString stringWithFormat:@"%@",[NSByteCountFormatter stringFromByteCount:[self getFreeDiskspace] countStyle:NSByteCountFormatterCountStyleFile]];
    NSString *message = [NSString stringWithFormat:@"fishtune_c;%@(%@),1092809312741,jyce09@gmail.com,%@;",[self platformString],[[GetIpAndMacAddress sharedInstance] getMacAddress],space];
    messageData = [[NSData alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding]];
    [outputStream write:[messageData bytes] maxLength:[messageData length]];
}


- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
{
    NSLog(@"stream event %i", streamEvent);

    switch (streamEvent) {

    case NSStreamEventOpenCompleted:
        NSLog(@"Stream opened");

        break;

    case NSStreamEventHasBytesAvailable:

        if (theStream == inputStream) {

            uint8_t buffer[1024];//1024
            int len;

            while ([inputStream hasBytesAvailable]) {
                len = [inputStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0) {

                    NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];

                    if (nil != output) {

                        NSLog(@"server reply: %@", output);
                    }
                }
            }
        }

        break;

    case NSStreamEventHasSpaceAvailable:
        NSLog(@"Stream has space available now");
        [self sendStringRequest];
        break;

    case NSStreamEventErrorOccurred:
    {
        NSLog(@"Can not connect to the host!");
        NSError *theError = [theStream streamError];
        NSLog(@"%@",[NSString stringWithFormat:@"%@",[theError localizedDescription]]);
    }
        break;

    case NSStreamEventEndEncountered:

        [theStream close];
        [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        theStream = nil;

        break;
    default:
        NSLog(@"Unknown event");
}
}

次に、このメソッドを呼び出します。これは、1 から 255 まで繰り返したいメソッドです。

CFStringRef aCFString = (__bridge CFStringRef)@"IPfrom 1 to 255";
[[IOStreamHelper sharedInstance] initWithIpAddress:aCFString port:49160];

これを適切に繰り返す方法を知りたいです。ありがとう

4

0 に答える 0