<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en" xmlns="http://www.w3.org/2005/Atom"><title>Recent posts to non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/" rel="alternate"/><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/feed.atom" rel="self"/><id>https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/</id><updated>2020-02-27T18:51:43.192000Z</updated><subtitle>Recent posts to non-blocking mode in tcpip</subtitle><entry><title>non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/?limit=25#f5ba" rel="alternate"/><published>2020-02-27T18:51:43.192000Z</published><updated>2020-02-27T18:51:43.192000Z</updated><author><name>danyamian</name><uri>https://forge.codesys.com/u/danyamian/</uri></author><id>https://forge.codesys.com4e6831e8338711787a41b72ab155ccf1053b1aa2</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;leon517 hat geschrieben:&lt;/strong&gt;&lt;br/&gt;
PROGRAM TcpServer&lt;br/&gt;
VAR_INPUT&lt;br/&gt;
    nTcp                                    :       INT;&lt;br/&gt;
    Rcv                             :   FB_Fifo999;&lt;br/&gt;
    sIP                             :   STRING(255) := '192.168.1.11';&lt;br/&gt;
    IPport                          :   WORD        := 5555;&lt;br/&gt;
    tDelay                          :   TIME        := T#100MS;&lt;br/&gt;
END_VAR&lt;br/&gt;
VAR_OUTPUT&lt;br/&gt;
    AcceptHl                                :   DINT;&lt;br/&gt;
    cnt                             :   BOOL;&lt;br/&gt;
END_VAR&lt;br/&gt;
VAR&lt;br/&gt;
    ListenHl,Hl                             :   DINT;&lt;br/&gt;
    Rv0                             :   BOOL;&lt;br/&gt;
    ServerAds,AcceptAds                     :   SOCKADDRESS;&lt;br/&gt;
    ClienSize                               :   DWORD;&lt;br/&gt;
    sRcv                                    :   STRING(255);&lt;br/&gt;
    RcvNum                          :   DINT;&lt;br/&gt;
    nNum,n1                         :   UINT; &lt;br/&gt;
    bHead                           :   ARRAY &lt;span&gt;[0..5]&lt;/span&gt; OF BYTE;&lt;br/&gt;
END_VAR&lt;br/&gt;
CASE nTcp OF&lt;br/&gt;
    0://Create handle&lt;br/&gt;
    ListenHl                        := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM,SOCKET_IPPROTO_TCP );&lt;br/&gt;
    IF ListenHl &amp;lt;&amp;gt; 0 THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -1;//create socket error &lt;br/&gt;
    END_IF&lt;br/&gt;
    1://Convert IP&lt;br/&gt;
    ServerAds.sin_addr              := SysSockInetAddr(sIP);&lt;br/&gt;
    ServerAds.sin_port              := SysSockHtons(IPport);&lt;br/&gt;
    ServerAds.sin_family            := SOCKET_AF_INET;&lt;br/&gt;
    nTcp                            := nTcp + 1;&lt;br/&gt;
    2://Bind Ip&lt;br/&gt;
    Rv0                             := SysSockBind(ListenHl,ADR(ServerAds),SIZEOF(ServerAds));&lt;br/&gt;
    IF  Rv0 THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -2;//Blind ip error&lt;br/&gt;
//      nTcp                        := 18;//Blind ip error&lt;br/&gt;
    END_IF&lt;br/&gt;
    3://Create listenhandle&lt;br/&gt;
    Rv0                             := SysSockListen(ListenHl , 0 );&lt;br/&gt;
    IF Rv0  THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -3;//listen error&lt;br/&gt;
//      nTcp                        := 18;//listen error&lt;br/&gt;
    END_IF&lt;br/&gt;
    4://Accept Client&lt;br/&gt;
    AcceptHl                        := SysSockAccept(ListenHl, ADR(AcceptAds),ADR(ClienSize));&lt;br/&gt;
    IF AcceptHl &amp;gt; 0 THEN&lt;br/&gt;
        SysSockClose(ListenHl);&lt;br/&gt;
        cnt                         := TRUE;&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    END_IF&lt;br/&gt;
END_CASE&lt;br/&gt;
//&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;Question&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;br/&gt;
The socket is basically created and exploited in the blocking mode. This may cause trouble in PLC&lt;br/&gt;
application because the program will stop on the function call where it waits the function finished.&lt;br/&gt;
By default, the call of socket function could be blocking for the following TCP oriented functions:&lt;br/&gt;
SysSockRecv(), SysSockSend(),SysSockConnect(), SysSockAccept(),SysSockClose();&lt;br/&gt;
Theoretically, in Data Transfer phase of the TCP connection, the order of call of functions Send() and&lt;br/&gt;
Recv() doesn't matter. But, for the same process (task), the sequence:&lt;br/&gt;
SysSockRecv();&lt;br/&gt;
SysSockSend();&lt;br/&gt;
could be critical. The program will not be able to send something if before, it does not receive something.&lt;br/&gt;
//&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;Question&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;/em&gt;&lt;br/&gt;
There are different ways to solve this problem in the PLC application:&lt;br/&gt;
1. The use of one task for PLC control and some several separate tasks for socket and&lt;br/&gt;
communication handling&lt;br/&gt;
2. Changing of the socket mode into no blocking mode via function SysSockIoctl()&lt;br/&gt;
3. The use the function SysSockSelect()&lt;br/&gt;
I tryed the first way using separate tasks and it works.But when there are many clients,it is not good enough.&lt;br/&gt;
What I want to know:How to use the way2 and way3?&lt;br/&gt;
Would any guys provide code basically on mine?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hi, I'm working on a similar project. I have a raspberry in which I need to run a TCP server where I will receive messages from clients by sockets. I can not get it to work properly, have you managed to get it to work properly? Do you have more information on the server?&lt;/p&gt;
&lt;p&gt;Thank you very much.&lt;/p&gt;&lt;/div&gt;</summary></entry><entry><title>non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/?limit=25#e4ed" rel="alternate"/><published>2020-02-27T18:51:42.035000Z</published><updated>2020-02-27T18:51:42.035000Z</updated><author><name>leon517</name><uri>https://forge.codesys.com/u/leon517/</uri></author><id>https://forge.codesys.com5130b7972526585e301b4d87bb6a0cadc20045bd</id><summary type="html"/></entry><entry><title>non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/?limit=25#0354" rel="alternate"/><published>2020-02-27T18:51:38.743000Z</published><updated>2020-02-27T18:51:38.743000Z</updated><author><name>leon517</name><uri>https://forge.codesys.com/u/leon517/</uri></author><id>https://forge.codesys.come830f2526a3e933917ff46168d3756db74cbf12f</id><summary type="html"/></entry><entry><title>non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/?limit=25#405f" rel="alternate"/><published>2020-02-27T18:51:37.581000Z</published><updated>2020-02-27T18:51:37.581000Z</updated><author><name>leon517</name><uri>https://forge.codesys.com/u/leon517/</uri></author><id>https://forge.codesys.com8130f9317a8eac6fe2ba89dad4aeaee71716f5b4</id><summary type="html"/></entry><entry><title>non-blocking mode in tcpip</title><link href="https://forge.codesys.com/forge/talk/Motion/thread/429443e16c/?limit=25#4809" rel="alternate"/><published>2020-02-27T18:51:34.282000Z</published><updated>2020-02-27T18:51:34.282000Z</updated><author><name>leon517</name><uri>https://forge.codesys.com/u/leon517/</uri></author><id>https://forge.codesys.comd6a1abeb4c53f62e711826755d388ac63877bbb3</id><summary type="html">&lt;div class="markdown_content"&gt;&lt;p&gt;PROGRAM TcpServer&lt;br/&gt;
VAR_INPUT&lt;br/&gt;
    nTcp                                    :       INT;&lt;br/&gt;
    Rcv                             :   FB_Fifo999;&lt;br/&gt;
    sIP                             :   STRING(255) := '192.168.1.11';&lt;br/&gt;
    IPport                          :   WORD        := 5555;&lt;br/&gt;
    tDelay                          :   TIME        := T#100MS;&lt;br/&gt;
END_VAR&lt;br/&gt;
VAR_OUTPUT&lt;br/&gt;
    AcceptHl                                :   DINT;&lt;br/&gt;
    cnt                             :   BOOL;&lt;br/&gt;
END_VAR&lt;br/&gt;
VAR&lt;br/&gt;
    ListenHl,Hl                             :   DINT;&lt;br/&gt;
    Rv0                             :   BOOL;&lt;br/&gt;
    ServerAds,AcceptAds                     :   SOCKADDRESS;&lt;br/&gt;
    ClienSize                               :   DWORD;&lt;br/&gt;
    sRcv                                    :   STRING(255);&lt;br/&gt;
    RcvNum                          :   DINT;&lt;br/&gt;
    nNum,n1                         :   UINT; &lt;br/&gt;
    bHead                           :   ARRAY &lt;span&gt;[0..5]&lt;/span&gt; OF BYTE;&lt;br/&gt;
END_VAR&lt;/p&gt;
&lt;p&gt;CASE nTcp OF&lt;br/&gt;
    0://Create handle&lt;br/&gt;
    ListenHl                        := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM,SOCKET_IPPROTO_TCP );&lt;br/&gt;
    IF ListenHl &amp;lt;&amp;gt; 0 THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -1;//create socket error &lt;br/&gt;
    END_IF&lt;br/&gt;
    1://Convert IP&lt;br/&gt;
    ServerAds.sin_addr              := SysSockInetAddr(sIP);&lt;br/&gt;
    ServerAds.sin_port              := SysSockHtons(IPport);&lt;br/&gt;
    ServerAds.sin_family            := SOCKET_AF_INET;&lt;br/&gt;
    nTcp                            := nTcp + 1;&lt;br/&gt;
    2://Bind Ip&lt;br/&gt;
    Rv0                             := SysSockBind(ListenHl,ADR(ServerAds),SIZEOF(ServerAds));&lt;br/&gt;
    IF  Rv0 THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -2;//Blind ip error&lt;br/&gt;
//      nTcp                        := 18;//Blind ip error&lt;br/&gt;
    END_IF&lt;br/&gt;
    3://Create listenhandle&lt;br/&gt;
    Rv0                             := SysSockListen(ListenHl , 0 );&lt;br/&gt;
    IF Rv0  THEN&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    ELSE&lt;br/&gt;
        nTcp                        := -3;//listen error&lt;br/&gt;
//      nTcp                        := 18;//listen error&lt;br/&gt;
    END_IF&lt;br/&gt;
    4://Accept Client&lt;br/&gt;
    AcceptHl                        := SysSockAccept(ListenHl, ADR(AcceptAds),ADR(ClienSize));&lt;br/&gt;
    IF AcceptHl &amp;gt; 0 THEN&lt;br/&gt;
        SysSockClose(ListenHl);&lt;br/&gt;
        cnt                         := TRUE;&lt;br/&gt;
        nTcp                        := nTcp + 1;&lt;br/&gt;
    END_IF&lt;br/&gt;
END_CASE&lt;/p&gt;
&lt;p&gt;//&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;Question&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;*&lt;br/&gt;
The socket is basically created and exploited in the blocking mode. This may cause trouble in PLC&lt;br/&gt;
application because the program will stop on the function call where it waits the function finished.&lt;br/&gt;
By default, the call of socket function could be blocking for the following TCP oriented functions:&lt;br/&gt;
SysSockRecv(), SysSockSend(),SysSockConnect(), SysSockAccept(),SysSockClose();&lt;/p&gt;
&lt;p&gt;Theoretically, in Data Transfer phase of the TCP connection, the order of call of functions Send() and&lt;br/&gt;
Recv() doesn't matter. But, for the same process (task), the sequence:&lt;br/&gt;
SysSockRecv();&lt;br/&gt;
SysSockSend();&lt;br/&gt;
could be critical. The program will not be able to send something if before, it does not receive something.&lt;/p&gt;
&lt;p&gt;//&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;Question&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;*&lt;br/&gt;
There are different ways to solve this problem in the PLC application:&lt;br/&gt;
1. The use of one task for PLC control and some several separate tasks for socket and&lt;br/&gt;
communication handling&lt;br/&gt;
2. Changing of the socket mode into no blocking mode via function SysSockIoctl()&lt;br/&gt;
3. The use the function SysSockSelect()&lt;/p&gt;
&lt;p&gt;I tryed the first way using separate tasks and it works.But when there are many clients,it is not good enough.&lt;br/&gt;
What I want to know:How to use the way2 and way3?&lt;br/&gt;
Would any guys provide code basically on mine?&lt;/p&gt;&lt;/div&gt;</summary></entry></feed>