2013-03-04 4 views
0

Мне нужна помощь для перевода этого кода с Python на Objective C (для iOS).Код сокета от python до Objective C

Я знаю, как создать сокет в C, но, возможно, Ther это самый элегантный способ сделать это с классами какао (NSStream?)

Что является эквивалентом Thats Chr (0x00) и b64encode?

Если у вас есть какие-то знания в Python и Objective, спасибо за вашу помощь!

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
new.connect((dst, 55000)) 

msg = chr(0x64) + chr(0x00) +\ 
    chr(len(base64.b64encode(src))) + chr(0x00) + base64.b64encode(src) +\ 
    chr(len(base64.b64encode(mac))) + chr(0x00) + base64.b64encode(mac) +\ 
    chr(len(base64.b64encode(remote))) + chr(0x00) + base64.b64encode(remote) 

pkt = chr(0x00) +\ 
    chr(len(app)) + chr(0x00) + app +\ 
    chr(len(msg)) + chr(0x00) + msg 
new.send(pkt) 

ответ

1

Этот код является рабочим переводом. Это, безусловно, может быть улучшено, и ваши комментарии приветствуются, но он отлично работает и делает именно то, что сделал код Python.

NSString * src = @"X.X.X.X"; 
NSString * mac = @"XX-XX-XX-XX-XX-XX"; 


const unsigned char byte64[] = {0x64}; 
const unsigned char byte00[] = {0x00}; 

NSString * srcString = [src base64EncodedString]; 
int srcDataLength = [srcString length]; 
char* srcDataLengthAsByte = (char*) &srcDataLength; 

NSString * macString = [mac base64EncodedString]; 
int macDataLength = [macString length]; 
char* macDataLengthAsByte = (char*) &macDataLength; 

NSString * remoteString = [remote base64EncodedString]; 
int remoteDataLength = [remoteString length]; 
char* remoteDataLengthAsByte = (char*) &remoteDataLength; 

NSString * appString = [app base64EncodedString]; 
int appDataLength = [appString length]; 
char* appDataLengthAsByte = (char*) &appDataLength; 

NSMutableData * msgData = [NSMutableData data]; 
[msgData appendBytes:byte64 length:1]; 
[msgData appendBytes:byte00 length:1]; 
[msgData appendBytes:srcDataLengthAsByte length:1]; 
[msgData appendBytes:byte00 length:1]; 
[msgData appendData:[srcString dataUsingEncoding:NSASCIIStringEncoding]]; 
[msgData appendBytes:macDataLengthAsByte length:1]; 
[msgData appendBytes:byte00 length:1]; 
[msgData appendData:[macString dataUsingEncoding:NSASCIIStringEncoding]]; 
[msgData appendBytes:remoteDataLengthAsByte length:1]; 
[msgData appendBytes:byte00 length:1]; 
[msgData appendData:[remoteString dataUsingEncoding:NSASCIIStringEncoding]]; 
int msgDataLength = [msgData length]; 
char* msgDataLengthAsByte = (char*) &msgDataLength; 

NSMutableData * packet = [NSMutableData data]; 
[packet appendBytes:byte00 length:1]; 
[packet appendBytes:appDataLengthAsByte length:1]; 
[packet appendBytes:byte00 length:1]; 
[packet appendData:[appString dataUsingEncoding:NSASCIIStringEncoding]]; 
[packet appendBytes:msgDataLengthAsByte length:1]; 
[packet appendBytes:byte00 length:1]; 
[packet appendData:msgData]; 
[self send:packet]; 

И гнездо часть:

- (BOOL)connect 
{ 
    struct sockaddr_in addr; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr([TV_IP UTF8String]); 
    addr.sin_port = htons(TV_PORT); 
    return connect(sockfd, (struct sockaddr*)&addr, sizeof(addr))==0; 
} 

- (long)send:(NSData*)data 
{ 
    long sent = send(sockfd, [data bytes], [data length], 0); 

    VADebugLog(@"sent data:(%ld bytes) = [%@]",sent,[data description]); 

    return sent; 
} 

-(void)close 
{ 
    close(sockfd); 
} 

И включают в base64 от: https://github.com/nicklockwood/Base64

#include <netinet/in.h> 
#include <arpa/inet.h> 
#import "Base64.h" 
1

Это частичный ответ. Это не Ваш вопрос о гнездах, как это область, которую я не имею никакого опыта, когда речь заходит о Objective-C

Как для других двух вопросов:

Что является эквивалентом chr(0x00)?

Эквивалент chr(0x<num>) - это просто '0xnum'. Так, например, chr(0x00) становится '0x00'. Обратите внимание, что важно использовать одиночные кавычки, а не двойные кавычки здесь, так как в отличие от python в C/object-c они имеют разные значения.

Что такое эквивалент b64encode?

Ну, похоже, что есть способ сделать это из коробки, как в случае с python. Однако есть entry for this on the SO wiki, который указывает на this article. В статье есть ссылка на некоторый исходный код в конце, который вы должны использовать как есть. Он работает с помощью категорий, чтобы добавить методы к NSData, которые позволят вам кодировать/декодировать строки base64.

+0

ОК Спасибо. Я написал начало перевода в моем первоначальном Вопросе. Как вы думаете, это выглядит хорошо? Я думал, что есть лучший способ написать этот мир кода ... –

+0

Я не думаю, что '' 0x00'' - это то, что вы хотите. Вы имеете в виду '' \ x00'', возможно? Или просто '0x00' без кавычек? –

+0

Я пробовал его с помощью gcc, и он работает на C, что означает, что он должен работать для objc. – entropy

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