Server mit Socket-Programmierung (SysSock)

SkyRuwen
2012-11-30
2018-01-29
  • SkyRuwen - 2012-11-30

    Hallo,

    ich habe mit CoDeSys V3.5.1.4 einen Server programmiert mit folgendem Code:

    Zu Beginn hatte ich bezüglich dem Funktionsaufruf um die Kommunikation aufzubauen folgenden Ansatz gewählt:
    1. Funktionsaufruf SysSockCreate
    2. Funktionsaufruf SysSockBind
    3. Funktionsaufruf SysSockListen
    4. Funktionsaufruf SysSockAccept

    Daraufhin werden dann die Funktionen SysSockSend und SysSockRecv ausgeführt.

    Obwohl ich einige Bytes sende, bekomme ich als Rückgabewert von SysSockSend 0 (d.h. der Socket wurde gracefully closed)
    Zusätzlich bekomme ich als Rückgabewert von SysSockBind den Fehlercode 519 (The provided address is already in use)

    Daraufhin habe ich den Funktionsaufruf SysSockSetOption vor die Funktion SysSockBind eingefügt. Der Fehler 519 bei SysSockBind ist damit weg, nur bekomme ich jetzt als Rückgabewert der Listen-Funktion ein "False"!

    Der Rückgabewert von SysSockSend ist erneut 0 (d.h. der Socket wurde gracefully closed)

    Weiß jemand, woran dies liegt?

    Hier ist der Code dazu:

    IF (ifirstRun = 1) THEN
       udiSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_IP, pErrorCreate); 
       pbyBufferRecv:=ADR(byBufferRecv); 
       pbyBufferSend:=ADR(byBufferSend);
       dwArg := 1;
       udInetAdress := SysSockInetAddr('127.0.0.1', ADR(inaddrVar));           
       SockAddrSend.sin_addr := inaddrVar;
       SockAddrSend.sin_family := SOCKET_AF_INET;      
       SockAddrSend.sin_port := SysSockHtons(4555);
                 pSockAddrSend:=ADR(SockAddrSend);
          
       iValue := 1;
       udSetOption := SysSockSetOption(udiSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(iValue), SIZEOF (iValue)); 
       udBind := SysSockBind(udiSocket, pSockAddrSend, SIZEOF(SockAddrSend) );                
       
       diMaxConnect:=10;
       udlisten:= SysSockListen(udiSocket, diMaxConnect);   
       udiNewSocket := SysSockAccept(udiSocket,pSockAddrSend, pSockAddrSend, pErrorAccept);
       
       byBufferSend[1] := 0 ;
       
       ifirstrun := 0;
    END_IF   
    diRecv := SysSockRecv(udiNewSocket,pbyBufferRecv, SIZEOF(byBufferRecv), diFlags, pErrorRecv);
       
    byBufferSend[0] := 1 ; 
    byBufferSend[1] := byBufferSend[1] + 1;
       
    diSent := SysSockSend(udiNewSocket, pbyBufferSend, SIZEOF(byBufferSend), diFlags , pErrorSend);  
    

    Vielen Dank im Voraus und besten Gruß,
    SkyRuwen

     

    Related

    Talk.ru: 1

  • danyamian - 2018-01-29

    SkyRuwen hat geschrieben:
    Hallo,
    ich habe mit CoDeSys V3.5.1.4 einen Server programmiert mit folgendem Code:
    Zu Beginn hatte ich bezüglich dem Funktionsaufruf um die Kommunikation aufzubauen folgenden Ansatz gewählt:
    1. Funktionsaufruf SysSockCreate
    2. Funktionsaufruf SysSockBind
    3. Funktionsaufruf SysSockListen
    4. Funktionsaufruf SysSockAccept
    Daraufhin werden dann die Funktionen SysSockSend und SysSockRecv ausgeführt.
    Obwohl ich einige Bytes sende, bekomme ich als Rückgabewert von SysSockSend 0 (d.h. der Socket wurde gracefully closed)
    Zusätzlich bekomme ich als Rückgabewert von SysSockBind den Fehlercode 519 (The provided address is already in use)
    Daraufhin habe ich den Funktionsaufruf SysSockSetOption vor die Funktion SysSockBind eingefügt. Der Fehler 519 bei SysSockBind ist damit weg, nur bekomme ich jetzt als Rückgabewert der Listen-Funktion ein "False"!
    Der Rückgabewert von SysSockSend ist erneut 0 (d.h. der Socket wurde gracefully closed)
    Weiß jemand, woran dies liegt?
    Hier ist der Code dazu:

    IF (ifirstRun = 1) THEN
       udiSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_IP, pErrorCreate); 
       pbyBufferRecv:=ADR(byBufferRecv); 
       pbyBufferSend:=ADR(byBufferSend);
       dwArg := 1;
       udInetAdress := SysSockInetAddr('127.0.0.1', ADR(inaddrVar));           
       SockAddrSend.sin_addr := inaddrVar;
       SockAddrSend.sin_family := SOCKET_AF_INET;      
       SockAddrSend.sin_port := SysSockHtons(4555);
                 pSockAddrSend:=ADR(SockAddrSend);
          
       iValue := 1;
       udSetOption := SysSockSetOption(udiSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR(iValue), SIZEOF (iValue)); 
       udBind := SysSockBind(udiSocket, pSockAddrSend, SIZEOF(SockAddrSend) );                
       
       diMaxConnect:=10;
       udlisten:= SysSockListen(udiSocket, diMaxConnect);   
       udiNewSocket := SysSockAccept(udiSocket,pSockAddrSend, pSockAddrSend, pErrorAccept);
       
       byBufferSend[1] := 0 ;
       
       ifirstrun := 0;
    END_IF   
    diRecv := SysSockRecv(udiNewSocket,pbyBufferRecv, SIZEOF(byBufferRecv), diFlags, pErrorRecv);
       
    byBufferSend[0] := 1 ; 
    byBufferSend[1] := byBufferSend[1] + 1;
       
    diSent := SysSockSend(udiNewSocket, pbyBufferSend, SIZEOF(byBufferSend), diFlags , pErrorSend);
    

    Vielen Dank im Voraus und besten Gruß,
    SkyRuwen

    Hi, ich arbeite an einem ähnlichen Projekt. Ich habe eine Raspberry, in der ich einen TCP-Server ausführen muss, wo ich Nachrichten von Clients durch Sockets erhalten werde. Ich kann es nicht richtig funktionieren lassen, hast du es geschafft, es richtig funktionieren zu lassen? Haben Sie mehr Informationen über den Server oder ein Beispielprojekt?

    Vielen Dank

     

Log in to post a comment.