CFSocket envoi d'un packet côté client
highthem
Membre
Bonjour,
Cela fait un bout de temps que je bute donc je crie "à l'aide".
Voilà , je travaille avec un dock qui est pilotable en IP et qui se comporte comme un serveur.
J'ai réussi à trouver son adresse IP et son port et maintenant je veux lui envoyer un paquet via sockets pour lui lancer une commande.
A prioris, la connexion s'effectue correctement car j'ai un retour de connexion.
L'envoi se fait également mais pas de la bonne manière je pense.
En effet, le paquet doit être une suite de bytes contenant les valeurs hexadécimales suivantes : 0x2A, 0x49, 0x00, 0x04, 0x38, 0x3C, 0x1A, 0x01, 0x24.
En retour à cette requête je reçois : "<>", ce qui signifie, je pense, qu'il n'a pas réussi à interpréter mon message.
Voici mon code :
- (void)viewDidLoad {
[super viewDidLoad];
// Création de la socket client avec une fonction callback appelée lors d'une connexion ou d'une réception de packet
socket = CFSocketCreate(kCFAllocatorDefault,
PF_INET, SOCK_STREAM, IPPROTO_TCP,
kCFSocketConnectCallBack | kCFSocketDataCallBack,
(CFSocketCallBack)ClientCallBack,
NULL);
// Contexte d'adressage (adresse IP et port du dock)
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(47678);
sin.sin_addr.s_addr = inet_addr("192.168.4.184");
CFDataRef address = CFDataCreate(NULL,(unsigned char*)&sin,sizeof(sin));
// Connexion avec la socket serveur
CFSocketConnectToAddress(socket, address, -1 );
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, socket, 0 );
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
CFRelease(sourceRef);
CFRunLoopRun();
while(1) {
struct timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 1;
select(-1, NULL, NULL, NULL, &tv);
}
// Fonction callback
void ClientCallBack( CFSocketRef s,
CFSocketCallBackType type,
CFDataRef address,
const void *data,
void *info)
{
if (type == kCFSocketConnectCallBack) {
NSLog(@Bien connecté avec le dock);
char toSend[] = {0x2A, 0x49, 0x00, 0x04, 0x38, 0x3C, 0x1A, 0x01, 0x24};
// Paquet doit être envoyé sous forme de CFDataRef dans la fonction CFSocketSendData
CFDataRef data_test = CFDataCreate(NULL, (unsigned char*)&toSend, sizeof(toSend));
CFTimeInterval timeout = 10 ; // how long to wait before returning
// Envoi du paquet
CFSocketError err = CFSocketSendData(s, address, data_test, timeout);
if (err == kCFSocketSuccess) NSLog(@Send Succeeded!);
else NSLog(@Send Failed);
}
else if (type == kCFSocketDataCallBack) {
NSLog(@Des données ont été reçues : %@", data);
}
}
Merci beaucoup pour votre aide.
Cela fait un bout de temps que je bute donc je crie "à l'aide".
Voilà , je travaille avec un dock qui est pilotable en IP et qui se comporte comme un serveur.
J'ai réussi à trouver son adresse IP et son port et maintenant je veux lui envoyer un paquet via sockets pour lui lancer une commande.
A prioris, la connexion s'effectue correctement car j'ai un retour de connexion.
L'envoi se fait également mais pas de la bonne manière je pense.
En effet, le paquet doit être une suite de bytes contenant les valeurs hexadécimales suivantes : 0x2A, 0x49, 0x00, 0x04, 0x38, 0x3C, 0x1A, 0x01, 0x24.
En retour à cette requête je reçois : "<>", ce qui signifie, je pense, qu'il n'a pas réussi à interpréter mon message.
Voici mon code :
- (void)viewDidLoad {
[super viewDidLoad];
// Création de la socket client avec une fonction callback appelée lors d'une connexion ou d'une réception de packet
socket = CFSocketCreate(kCFAllocatorDefault,
PF_INET, SOCK_STREAM, IPPROTO_TCP,
kCFSocketConnectCallBack | kCFSocketDataCallBack,
(CFSocketCallBack)ClientCallBack,
NULL);
// Contexte d'adressage (adresse IP et port du dock)
struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_len = sizeof(sin);
sin.sin_family = AF_INET;
sin.sin_port = htons(47678);
sin.sin_addr.s_addr = inet_addr("192.168.4.184");
CFDataRef address = CFDataCreate(NULL,(unsigned char*)&sin,sizeof(sin));
// Connexion avec la socket serveur
CFSocketConnectToAddress(socket, address, -1 );
CFRunLoopSourceRef sourceRef = CFSocketCreateRunLoopSource(kCFAllocatorDefault, socket, 0 );
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
CFRelease(sourceRef);
CFRunLoopRun();
while(1) {
struct timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 1;
select(-1, NULL, NULL, NULL, &tv);
}
// Fonction callback
void ClientCallBack( CFSocketRef s,
CFSocketCallBackType type,
CFDataRef address,
const void *data,
void *info)
{
if (type == kCFSocketConnectCallBack) {
NSLog(@Bien connecté avec le dock);
char toSend[] = {0x2A, 0x49, 0x00, 0x04, 0x38, 0x3C, 0x1A, 0x01, 0x24};
// Paquet doit être envoyé sous forme de CFDataRef dans la fonction CFSocketSendData
CFDataRef data_test = CFDataCreate(NULL, (unsigned char*)&toSend, sizeof(toSend));
CFTimeInterval timeout = 10 ; // how long to wait before returning
// Envoi du paquet
CFSocketError err = CFSocketSendData(s, address, data_test, timeout);
if (err == kCFSocketSuccess) NSLog(@Send Succeeded!);
else NSLog(@Send Failed);
}
else if (type == kCFSocketDataCallBack) {
NSLog(@Des données ont été reçues : %@", data);
}
}
Merci beaucoup pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses