Hi. I'm trying to build a port forwarding program that lets two computers that are behind NATs (mutually invisible to each other) communicate via a computer they both can connect to (bridge). To do this, I need to be able to capture TCP packets directly and send them. Is there a way to capture TCP packets (either without or with headers) without being superuser on UNIX like systems or Administrator on Windows?
<br><br>I tried the following program, but the socket cannot be bound. I suppose that this is because there is no mechanism receiving TCP packets in the network stack - only stream communication?<br><br>byte buffer[2048];
<br>int main(int argc, char **argv)<br>{<br>&nbsp;&nbsp; WSADATA wsa_data;<br>&nbsp;&nbsp; if (WSAStartup(MAKEWORD(2, 0), &amp;wsa_data) != 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;WSAStartup() failed\n&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp; }
<br>&nbsp; socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP);<br>&nbsp; sockaddr_in addrLocal;<br>&nbsp; addrLocal.sin_family = AF_INET;<br>&nbsp; addrLocal.sin_addr.s_addr = inet_addr(&quot;<a href="http://127.0.0.1">127.0.0.1</a>&quot;);<br>
&nbsp; addrLocal.sin_port = htons(3390);<br>&nbsp; <br>&nbsp; if (bind(socket, (sockaddr *)&amp;addrLocal, sizeof(sockaddr_in)) == SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; &quot;error bind&quot; &lt;&lt; endl;<br><br>&nbsp; listen(socket, 10);<br>
&nbsp; while (true)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp; sockaddr_in addr;<br>&nbsp;&nbsp;&nbsp; &nbsp; int address_length = sizeof(addr), connection;<br>&nbsp;&nbsp;&nbsp; &nbsp; while ((connection = accept(g_socket, (sockaddr *)&amp;addr, &amp;address_length)) &lt; 0);<br>&nbsp;&nbsp;&nbsp; &nbsp; cout &lt;&lt; &quot;connected&quot;;
<br>&nbsp;&nbsp;&nbsp; &nbsp; while (true)<br>&nbsp;&nbsp;&nbsp; &nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp; int length = recvfrom(connection, (char *)buffer, 2048, 0, (sockaddr *)&amp;addr, &amp;address_length);<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; &nbsp; int length = recv(connection, (char *)buffer, 2048, 0);<br>
&nbsp;&nbsp;&nbsp; &nbsp; cout &lt;&lt; length &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp; }<br>&nbsp; }<br>&nbsp; return 0;<br>}<br><br>Any ideas about how to do what I want or alternatives? Thanks for any help.<br>