Προς το περιεχόμενο

send και recv Functions


papalive

Προτεινόμενες αναρτήσεις

Δημοσ.

Μπορεί καπιος να εξηγησει πως μπορω να χρησιμοποιήσω τις functions

 

send( m_socket, sendbuf, strlen(sendbuf), 0 );

 

και

 

recv(ConnectSocket, recvbuf, recvbuflen, 0);

 

μεταξύ client και server?

 

Ξέρω πως πρέπει να γίνουν τα παρακάτω για client και server

 

Server

 

1. Initialize Winsock.

2. Create a socket.

3. Bind the socket.

4. Listen on the socket for a client.

5. Accept a connection from a client.

6. Receive and send data.

7. Disconnect.

 

Client

 

1. Initialize Winsock.

2. Create a socket.

3. Connect to the server.

4. Send and receive data.

5. Disconnect.

 

αλλά δεν μπορώ να καταλάβω πως θα στειλουν δεδομένα μεταξύ τους.πχ να στείλει ο server το HELLO WORLD!!!

Δημοσ.

http://www.insomnia.gr/forum/showthread.php?t=345276 Από εδώ ίσως κάτι σε βοηθήσει.. Κάπου μέσα είχα δώσει και ένα λινκ από έναν πολύ καλό οδηγό που τα εξηγούσε όλα τα σχετικά με sockets και είχε και παραδείγματα.. Και αν ψάξεις και στο wikipedia για αυτές τις συναρτήσεις επίσης νομίζω ότι έχει έτοιμα παραδείγματα...

 

Δεν έχω εύκαιρο compiler για να τσεκάρω τον κώδικα που έδωσες..

Δημοσ.

Απο την στιγμή που θα γίνει η σύνδεση μεταξύ client - server πως θα μεταφερθούν δεδομένα με την χρήση των send - rcv ? ? ? ? ? ? ? ? ? ? ? ? ?

Δημοσ.
Απο την στιγμή που θα γίνει η σύνδεση μεταξύ client - server πως θα μεταφερθούν δεδομένα με την χρήση των send - rcv ? ? ? ? ? ? ? ? ? ? ? ? ?

 

Τα υπόλοιπα βήματα τα κατανοείς? Οποιοδίποτε βιβλίο για sockets έχει παραδείγματα server-client (συνήθος echo/time server).

Δημοσ.

server

iniz winsock -> accept... -> recv -> send ->recv-> etc... close-> accept...

 

clinet

iniz winsock -> connect...->send ->recv -> send -> etc... close

 

 

10 χαρακτηρες.. Γουσταρω το Μαρακι

Δημοσ.

Ειναι μια συνάρτηση ( φυσικά ολα τα προηγούμενα που απαιτούνται τρέχουν κανονικά ) ...

 

bool clientClass::createSocket(char *ip,char *port){

 

 

 

ZeroMemory( &hints, sizeof(hints) );

hints.ai_family = AF_UNSPEC;

hints.ai_socktype = SOCK_STREAM;

hints.ai_protocol = IPPROTO_TCP;

 

//ως ip βάζω 127.0.0.1 και Port 80 .Τα δεδομένα αυτά τα δίνω σε δυο απλά editBox

 

//ΠΡΟΣΟΧΗ ΣΤΟ argv[1]

// Resolve the server address and port

iResult = getaddrinfo(ip ,port , &hints, &result);

if (iResult != 0) {

printf("getaddrinfo failed: %d\n", iResult);

WSACleanup();

return false;

}

}

 

που οταν την καλώ μου εμφανίζει το παρακάτω μήνυμα το Rad Studio 2010 και δεν ξέρω γιατί.

[iLINK32 Error] Error: Unresolved external 'getaddrinfo' referenced from C:\USERS\VASO\DESKTOP\FLASH\CLIENT\DEBUG\CLIENTCLASS.OBJ

 

Η κλήση της getaddrinfo(ip ,port , &hints, &result); είναι το Α και το Ω και χωρίς αυτήν δεν μπορώ να προχωρήσω!!!!

 

( Μήπως παίζει τίποτα με τα VISTA ??? )

για λεπτομέρειες -> http://msdn.microsoft.com/en-us/library/bb530741%28VS.85%29.aspx

Δημοσ.
Έχεις κάνει link την wsock32.lib? η συνάρτηση που αναφέρεις είναι εκεί.

 

Εχω δηλώσει τα παρακάτω

 

#include <stdio.h>

#include <winsock2.h>

#include <ws2tcpip.h>

#include<VCL.h>

 

#pragma comment(lib,"ws2_32.lib");

 

και ΤΡΕΧΕΙ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

thanks για τις απαντήσεις αν εχω κάτι αλλο θα ενημερώσω!!!!

 

( χοχοχοχοχοχοχο )

Δημοσ.

Καλησπέρα και πάλι.

 

Τελικά κατάφερα και εκανα αυτό που ήθελα οπότε και χάρηκα!!

 

Εχω τώρα άλλες απορίες.

 

1) Για να μπορέσουν να συνδεθούν περισσότεροι του ενός clients θα πρέπει ο server να χρησιμοποιεί τα νήματα ( threads ) ετσι δεν είναι ? Κάποια επιπλέον πληροφορία η κώδικα για πειράμαα αν γνωρίζεται???

 

2) Στον server δίνω την διεύθυνση 127.0.0.1 δηλαδή δουλεύω τοπικά.Αν θέλω να συνδεθώ σε άλλο υπολογιστή μεσω router τι θα πρέπει να διαβάσω και να γνωρίζω προκειμένου να το πετύχω???

 

3) Οταν στέλνω με την send(...) ενα μηνυμα απο τον server στον client τότε μεφανίζεται κανονικα στην πλευρά του client.Οταν ομως στελνω ενα μήνυμα απο τον client στον server τότε η recv(...) δεν εκτελείται κανονικα και μου επιστρέφει κωδικό σφαλματος 10053 οταν χρησιμοποιησω την GetLastError();

 

γιατί άραγεεε???

 

παραθέτω και τους κωδικες

 

 

server

 

bool serverClass::sendData(char *buffer){

 

if (send(mySocket,buffer,strlen(buffer),0) == SOCKET_ERROR){

closesocket(mySocket);

WSACleanup();

return false;

}

 

return true;

}

 

 

char* serverClass::recvData(){

 

i = recv(mySocket, buffer , size , 0);

 

//εδω αν εκτελεστει σωστα η recv(...) επιστρέφει

//τον αριθμό των bytes που δεχτηκε.Α δεν λειτουργήσει επιστρέφει

//-1.Χρησιμοποίησα την GetLastError και επέστρεψε κωδικό σφάλματος

//10053.

 

if(i>0)

{

buffer='\0';

return buffer;

}

else

{

return buffer="error";

}

 

}

 

client

 

bool clientClass::sendingData(char *message){

 

if (send(ConnectSocket,message,strlen(message),0) == SOCKET_ERROR){

closesocket(ConnectSocket);

WSACleanup();

return false;

}

return true;

}

 

char* clientClass::recvData(){

 

i = recv(ConnectSocket, recvbuf, recvbuflen, 0);

if(i>0)

{

recvbuf='\0';

return recvbuf;

}

 

}

post-155750-12906307754_thumb.jpg

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...