In a connection-oriented transport, applications are required to establish a virtual circuit (sometimes abbreviated to Visual C) before data transfer can take place. Virtual circuit establishment is asymmetric: one side, the server, must make known to the transport its willingness to receive incoming connections via the listen() API. The other side, the client, initiates the circuit with the connect() API, and the server can obtain a socket for the circuit with the accept() API. Once the circuit is established, data transfer takes place with the send() and recv() APIs. There is protocol-level activity which results from this circuit establishment, and more protocol activity tears down the circuit when the sockets are closed. TCP and SPX are examples of connection-oriented transport protocols.
In a connectionless transport, there is no circuit establishment required for data transfer. An application only needs to open and bind a socket, after which it may use the sendto() and recvfrom() APIs to send and receive data. Of course, in order to specify the remote address for sending data or the address from which received data was sent, an application must specify a sockaddr to these routines. UDP and IPX are examples of connectionless transport protocols.
It is possible to use the connect() API on sockets opened for connectionless protocols. This is merely an application convenience, allowing the application to use the send() and recv() APIs, and this does not result in any protocol activity. If a socket is connected in this manner, it will only receive packets sent from the connected address; other packets destined for the socket are silently discarded.