Aller au contenu

Messages recommandés

Bonjour à tous !

 

Alors, voilà, je suis en train de créer une application pour Iphone/Ipad en Objective c et j'ai un problème :

 

Je cherche à transférer des données (pour l'instant juste une chaîne de caractère) entre deux appareils via un réseau local.

 

J'ai trouvé pas mal d'informations concernant le réseau TCP ou UDP et en passant par les sockets mais j'ai rencontré différent problème :

 

1) En essayant de passer pas NSSocketPort : j'ai trouvé peu d'informations mais surtout mon programme ne reconnait pas les NSSocketPort, alors qu'il reconnaît NSPort.

 

Voici le code :

NSData *Donnees;
NSSocketPort *sockPort = nil;
NSConnection *connex;
sockPort = [[NSMachPort alloc] init];
connex = [[NSConnection alloc] initWithReceivePort:receivePortsendPort:nil];
int sockFD = [sockPort socket];

NSFileHandle *clientSocket;
clientSocket = [[NSFileHandle alloc] initWithFileDescriptor:sockFD];

 

2) En essayant en intégrant du code C, et en utilisant les sockets du C. J'ai bien réussi à coder, aucune erreur au niveau du code. Mais au moment de la compilation, je me retrouve avec l'erreur suivante :

clang: error: linker command failed with exit code 1 (use -v to see invocation)

 

Voici le code des fonctions de création des connection serveur et client ( c'est un fichier .c, j'appelle les fonctions connectionServ() et connectionCli() dans les fichiers .m ) :

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define closesocket(s) close(s)
typedef int SOCKET;
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
#define PORT 23
void connectionServ()
{
int erreur = 0;

/* Socket et contexte d'adressage du serveur */
SOCKADDR_IN sin;
SOCKET sock;
socklen_t recsize = sizeof(sin);

/* Socket et contexte d'adressage du client */
SOCKADDR_IN csin;
SOCKET csock;
socklen_t crecsize = sizeof(csin);
int sock_err;

if(!erreur)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock != INVALID_SOCKET)
 {
printf("La socket %d est maintenant ouverte en mode TCP/IP\n", sock);

/* Configuration */
	 sin.sin_addr.s_addr = htonl(INADDR_ANY); /* Adresse IP automatique */
	 sin.sin_family = AF_INET;				 /* Protocole familial (IP) */
	 sin.sin_port = htons(PORT);			 /* Listage du port */
	 sock_err = bind(sock, (SOCKADDR*)&sin, recsize);

/* Si la socket fonctionne */
	 if(sock_err != SOCKET_ERROR)
	 {
/* Démarrage du listage (mode server) */
		 sock_err = listen(sock, 5);
		 printf("Listage du port %d...\n", PORT);

/* Si la socket fonctionne */
		 if(sock_err != SOCKET_ERROR)
		 {
 /* Attente pendant laquelle le client se connecte */
			 printf("Patientez pendant que le client se connecte sur le port %d...\n", PORT);
			 csock = accept(sock, (SOCKADDR*)&csin, &crecsize);
			 printf("Un client se connecte avec la socket %d de %s:%d\n", csock, inet_ntoa(csin.sin_addr), htons(csin.sin_port));
}
else
{
 perror("listen");
}
}
else
{
perror("bind");
}

/* Fermeture de la socket client et de la socket serveur */
	 printf("Fermeture de la socket client\n");
	 closesocket(csock);
	 printf("Fermeture de la socket serveur\n");
	 closesocket(sock);
	 printf("Fermeture du serveur terminée\n");
}
else
{
perror("socket");
}
}
}
void connectionCli()
{
int erreur = 0;
SOCKET sock;
SOCKADDR_IN sin;

if(!erreur)
{
/* Création de la socket */
 sock = socket(AF_INET, SOCK_STREAM, 0);

/* Configuration de la connexion */
 sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 sin.sin_family = AF_INET;
 sin.sin_port = htons(PORT);

/* Si le client arrive à se connecter */
 if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
	 printf("Connexion à %s sur le port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
 else
	 printf("Impossible de se connecter\n");

/* On ferme la socket précédemment ouverte */
 closesocket(sock);
}
}

 

3) Utilisation des NSSocket, mais j'ai trouvé vraiment peu de documentation sur la façon de l'utiliser.

 

La ou je suis le plus proche c'est véritablement avec la deuxième solution mais voilà ça plante.

 

Donc voilà, si quelqu'un a une idée pour me débloquer je suis preneur.

 

 

Edit : Problème résolu pour la solution 2, il suffisait juste de mettre tout le contenu de mon .c dans mon .m ( la compil ne supportait pas l'appel à un .c )

Modifié par Ptytomtok
Lien à poster
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
×
×
  • Créer...