Connect function in raw socket?

3k views Asked by At

I am trying to initiate a TCP Three-Way-Handshake in C. However, it occurred to me that connect may already be establishing such a connection or in some way interfering. Does connect automatically establish a TCP connection whenever the socket it's called on has the IPPROTO_TCP option set?

2

There are 2 answers

4
SergeyA On BEST ANSWER

Yes, IPPROTO_TCP creates TCP socket. To use raw socket, you need to pass SOCK_RAW as second argument to the socket function.

0
Remy Lebeau On

Per MSDN documentation:

TCP/IP Raw Sockets

Once an application creates a socket of type SOCK_RAW, this socket may be used to send and receive data. All packets sent or received on a socket of type SOCK_RAW are treated as datagrams on an unconnected socket.

The following rules apply to the operations over SOCK_RAW sockets:

...

Received datagrams are copied into all SOCK_RAW sockets that satisfy the following conditions:

...

  • If a foreign address is defined for the socket, it should correspond to the source address as specified in the IP header of the received datagram. An application may specify the foreign IP address by calling the connect or WSAConnect function. If no foreign IP address is specified for the socket, the datagrams are copied into the socket regardless of the source IP address in the IP header of the received datagram.

This implies that RAW sockets are essentially connection-less sockets, and thus connect() does not perform a 3-way TCP handshake on a RAW socket. It simply associates a remote address with the socket, similar to how connect() works with a UDP (SOCK_DGRAM) socket.

More importantly:

Limitations on Raw Sockets

...

  • TCP data cannot be sent over raw sockets. ...

  • A call to the bind function with a raw socket for the IPPROTO_TCP protocol is not allowed.

So you can't use IPPROTO_TCP with a RAW socket to begin with, so the matter of connect() behavior on a RAW TCP socket is moot. IPPROTO_TCP can only be used with a real TCP (SOCK_STREAM) socket:

IPPROTO_TCP
6

The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM.