Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Mi-au disparut amigdalitele ?

Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone
 Monede JO 2024

Suprasolicitare sistem electric

CIV auto import

Mutare in MOZAMBIC - pareri, expe...
 Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...

Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...
 Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...

Kanal D va difuza serialul “...

Upgrade xiaomi mi11
 

winsock control

- - - - -
  • Please log in to reply
12 replies to this topic

#1
din suuk

din suuk

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 30.11.2005
salut. vreau sa fac o aplicatie care sa functioneze in felul urmator:
- aplicatia o sa ruleze pe fiecare calculator din reteaua din birou; cand cineva apasa un buton, aplicatia trebuie sa trimita o comanda la toate ip-urile din lista.
- pentru asta, am facut cate un control winsock pentru fiecare ip din lista, care cauta intr-un timer ip-ul asociat si incearca sa se conecteze.
- la fiecare request de conectare, creez un winsock nou care sa accepte conexiunea (care vine de la winsock-urile care incearca sa se conecteze, din celelalte aplicatii). astfel, as putea sa trimit comanda prin socket-urile de conectare sau prin cele care asculta portul... cand un socket gaseste ip-ul si se conecteaza, trimite numele calculatorului, care va fi pus intr-o lista a calculatoarelor conectate.

toate bune si frumoase.. problema e urmatoarea: am incercat cu 2 calculatoare. pe unul imi trimite numele calculatorului vecin, dar pe celalalt nu. probabil unul din calculatoare reuseste sa se conecteze, dar  celalalt nu.
oare nu pot exista 2 conexiuni pe acelasi canal? sau unde apare problema?
va rog sa-mi raspundeti daca aveti vreo idee..  :huh:

#2
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 20,032
  • Înscris: 24.02.2006
pune ceva cod. cu siguranta ai gresit ceva pe undeva.

#3
Marlo

Marlo

    New Member

  • Grup: Members
  • Posts: 20
  • Înscris: 10.11.2008

View Postdin suuk, on Nov 10 2008, 10:52, said:

salut. vreau sa fac o aplicatie care sa functioneze in felul urmator:
- aplicatia o sa ruleze pe fiecare calculator din reteaua din birou; cand cineva apasa un buton, aplicatia trebuie sa trimita o comanda la toate ip-urile din lista.
- pentru asta, am facut cate un control winsock pentru fiecare ip din lista, care cauta intr-un timer ip-ul asociat si incearca sa se conecteze.
- la fiecare request de conectare, creez un winsock nou care sa accepte conexiunea (care vine de la winsock-urile care incearca sa se conecteze, din celelalte aplicatii). astfel, as putea sa trimit comanda prin socket-urile de conectare sau prin cele care asculta portul... cand un socket gaseste ip-ul si se conecteaza, trimite numele calculatorului, care va fi pus intr-o lista a calculatoarelor conectate.

toate bune si frumoase.. problema e urmatoarea: am incercat cu 2 calculatoare. pe unul imi trimite numele calculatorului vecin, dar pe celalalt nu. probabil unul din calculatoare reuseste sa se conecteze, dar  celalalt nu.
oare nu pot exista 2 conexiuni pe acelasi canal? sau unde apare problema?
va rog sa-mi raspundeti daca aveti vreo idee..  :huh:

Cum trimiți numele calculatorului de la client la server?
Ai un protocol de comunicație definit?
Presupun că folosești senddata/getdata. VB6?

Edited by Marlo, 10 November 2008 - 12:18.


#4
Bean

Bean

    Guru Member

  • Grup: Senior Members
  • Posts: 17,477
  • Înscris: 12.11.2006
Foloseste UDP in loc de TCP. E conectionless, deci nu ai nevoie de Listen si Accept si Close (inclin sa cred ca nu faci Close si d-asta nu-ti merge). Trimiti datele pe un port prestabilit si trimiti mai apoi confirmarea de primire la sender, pe un alt port (sau chiar pe acelasi).

#5
din suuk

din suuk

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 30.11.2005
aici e timerul in care se acceseaza ip-urile din lista:

Private Sub tmrFind_Timer()
    'accesez pe rand adresele din lista si incerc sa ma conectez
    For i = 1 To UBound(LISTA_IP)
        If Not sockFind(i).State = sckConnected Then
            sockFind(i).Close
            If LISTA_IP(i) <> sockListen(0).LocalIP Then sockFind(i).Connect LISTA_IP(i), 5581    
        End If
    Next i
End Sub

iar aici se accepta conexiunile venind de la celelalte computere, care incearca sa se conecteze
Private Sub sockListen_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    'cand se cere conexiune, creez un nou socket si accept conexiunea
    Load sockListen(sockListen.count)  
    sockListen(sockListen.count - 1).Accept requestID
End Sub


trimit numele computerului local cand se conecteaza, pt a aparea in lista celuilalt

Private Sub sockFind_Connect(Index As Integer)
    sockFind(Index).SendData "numecomp|" & NumeComp
End Sub

iar aici primesc numele compului

Private Sub sockFind_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim GetIt As String
Dim msg() As String
    sockFind(Index).GetData GetIt
    msg = Split(GetIt, "|")
    Select Case msg(0)
        Case "numecomp": lstComputere.AddItem msg(1) & Space(100) & Index
    End Select
End Sub





Nu stiu ce presupune protocolul udp, nu l-am folosit niciodata. nu functioneaza pe acelasi principiu??

#6
Bean

Bean

    Guru Member

  • Grup: Senior Members
  • Posts: 17,477
  • Înscris: 12.11.2006
Ceea ce incerc eu sa spun este ca poti schimba protocolul folosit de controlul winsock. Anume, seteaza Winsock.Protocol = sckUDPProtocol si in acest mode nu mai ai nevoie de stabilirea unei conexiuni (de asta UDP este conectionless). Deci, nu mai trebuie sa preiei conexiuni, sa le accepti si sa asculti la porturi. Pur si simplu instantiezi winsock-ul la modul:

With Winsock
  .RemoteHost= "Name" 
  .RemotePort = xyz
  .Bind NumarPort
End With

Asta nu face altceva decat sa-ti aloce local portul NumarPort, pe care urmeaza sa primesti date cu .GetData (la eventul DataArrival, intr-un string sau un byte array) si instruieste winsockul sa trimita datele inapoi la hostul "Name" (sau IPul cutare) pe portul remote xyz, cu .SendData.

E mai facil sa folosesti UDP, daca nu esti prea preocupat de siguranta transmiterii (totusi, poti folosi reply-uri de confirmare a primirii).

Edited by Bean, 12 November 2008 - 23:38.


#7
msmihai

msmihai

    Senior Member

  • Grup: Senior Members
  • Posts: 5,271
  • Înscris: 02.09.2006
pentru tcp nu e nevoie sa scrii decat vreo 20 de linii in plus... dar ai siguranta transmiterii mesajelor . la nivel udp , chiar daca e mai simplu de scris, nu ai garantia ca pachetele sosesc in ordinea trimiterii sau daca ele mai ajung la destinatie . Practic : de cate ori am lucrat cu udp, nu prea am pierdut pachete.... si au venit si in ordine. Insa teoria asa spune : ca se pot pierde si mai rau, primi in alta ordine . Mergi pe TCP ;)

#8
Bean

Bean

    Guru Member

  • Grup: Senior Members
  • Posts: 17,477
  • Înscris: 12.11.2006

View Postmsmihai, on Nov 12 2008, 23:42, said:

pentru tcp nu e nevoie sa scrii decat vreo 20 de linii in plus... dar ai siguranta transmiterii mesajelor . la nivel udp , chiar daca e mai simplu de scris, nu ai garantia ca pachetele sosesc in ordinea trimiterii sau daca ele mai ajung la destinatie . Practic : de cate ori am lucrat cu udp, nu prea am pierdut pachete.... si au venit si in ordine. Insa teoria asa spune : ca se pot pierde si mai rau, primi in alta ordine . Mergi pe TCP ;)
Aici nu e vorba de stream de date, ci de datagrame singulare ce contin o comanda anume (un string). Intr-adevar UDP nu este safe, dar pentru aplicatia de fata nu e nevoie de complicatii (mai ales ca deduc cum ca ar fi in LAN). Poate chiar sa foloseasca si o metoda de flow control, la modul ca trimite o structura de date (UDT), in care unul din campuri sa fie chiar un indice de stream si altul sa fie totalul de senduri, dupa care reface streamul.

@din suuk

Cand vrei sa trimiti la mai multe hosturi, faci un For in care inserezi si RemoteHost= "Name"  sau IP (pe care evident il schimbi la fiecare iteratie), dai SendData si tot asa.

Edited by Bean, 12 November 2008 - 23:50.


#9
din suuk

din suuk

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 30.11.2005
am citit intre timp despre udp. n-ar fi problema, transmit comenzi foarte scurte. dar ideea era sa introduc in lista computerele pe care le gasesc pornite. asta s-ar putea face, trimit la toate adresele o interogare si care imi raspund, trimit numele si le introduc in lista. dar aplicatia trebuie sa ruleze pe 4-5 compuri si de pe fiecare comp sa pot primi comanda de la unul sau mai multe dintre ele. in cazul asta, ar trebui probabil sa aloc un port pentru fiecare comp in parte? pe cand pe tcp folosesc acelasi port pe fiecare computer...

Edited by din suuk, 13 November 2008 - 08:39.


#10
Bean

Bean

    Guru Member

  • Grup: Senior Members
  • Posts: 17,477
  • Înscris: 12.11.2006

View Postdin suuk, on Nov 13 2008, 08:33, said:

am citit intre timp despre udp. n-ar fi problema, transmit comenzi foarte scurte. dar ideea era sa introduc in lista computerele pe care le gasesc pornite. asta s-ar putea face, trimit la toate adresele o interogare si care imi raspund, trimit numele si le introduc in lista. dar aplicatia trebuie sa ruleze pe 4-5 compuri si de pe fiecare comp sa pot primi comanda de la unul sau mai multe dintre ele. in cazul asta, ar trebui probabil sa aloc un port pentru fiecare comp in parte? pe cand pe tcp folosesc acelasi port pe fiecare computer...
Nu e nevoie sa trimiti interogare. Trimiti pur si simplu la lista de adrese (lista statica, predefinita intr-un vector, presupun). Aplicatia poate sa ruleze linistita pe n-spe computere, nu trebuie sa schimbi nimic, caci va functiona. Va trimite date pe portul sa zicem 40222 si va primi pe 40223. Nu trebuie sa aloci cate un port pentru fiecare computer. Ai computerul C1 care asculta pe portul P si primeste pe P+1. C2 va trimite pe P+1 la fiecare Cx si va primi pe portul P. Nu inteleg care-i problema si nu-mi dau seama inca ce pare asa greu. Incearca sa-ti imaginezi grafic treaba, ia o foaie si un pix si-o sa vezi ca nu e deloc complicat.

#11
din suuk

din suuk

    New Member

  • Grup: Members
  • Posts: 22
  • Înscris: 30.11.2005
ok, o sa incerc. kiar k nu pare greu :P

ms mult pentru ajutor baieti! raman dator

#12
konami

konami

    Senior Member

  • Grup: Senior Members
  • Posts: 3,493
  • Înscris: 25.04.2008

View PostBean, on Nov 14 2008, 00:22, said:

Nu e nevoie sa trimiti interogare. Trimiti pur si simplu la lista de adrese (lista statica, predefinita intr-un vector, presupun).
...

daca trimiti pachetul la adresa de broadcast, ar trebui sa-l accepte orice calculator din retea, nu ?

#13
Bean

Bean

    Guru Member

  • Grup: Senior Members
  • Posts: 17,477
  • Înscris: 12.11.2006

View Postkonami, on Nov 14 2008, 16:36, said:

daca trimiti pachetul la adresa de broadcast, ar trebui sa-l accepte orice calculator din retea, nu ?
Ba da, il accepta, dar lucrurile difera daca reteaua e subnetata, in sensul ca trebuie gasita adresa de broadcast pentru fiecare subnet. Daca sunt in acelasi subnet toate calculatoarele din lista, atunci merge dat pe 255.255.255.255.

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate