java - C# server Socket to Android Socket over NAT -
the android app behind nat (3g connection) , while server on public ip.
the android app can connect server socket , send info (via socket/tcpclient on android) server cannot connect android port because of nats (server getting "... has failed respond "ip_adress_of_android : port_that_is_open_and_listening_on_android".
is there anyway overcome this, or parameters can utilize in order server connection effort reach it's destination on nats without using custom library? - or please point me easy implement method, don't have time study , integrate complicated 3rd party library
here sample of how server code works:
int port_server, port_android; // used declare used ports server , android socket server_socket, client_socket; //sockets used receive , send info server_socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); server_socket.bind(new ipendpoint(ipaddress.any, port_server)); server_socket.listen(0); public void listen() { server_socket.beginaccept(new asynccallback(acceptcallback), null); } private void acceptcallback(iasyncresult ar) { client_socket = server_socket.endaccept(ar); buffer = new byte[client_socket.receivebuffersize]; client_socket.beginreceive(buffer, 0, buffer.length, socketflags.none, new asynccallback(receivecallback), null); } private void receivecallback(iasyncresult ar) { listen(); // go on listening port // code info send_string("take this"); // sends string android } public void send_string(string notif) { string ip_client = client_socket.remoteendpoint.tostring(); string ip_client2 = (ip_c.split(':'))[0]; tcpclient client = new tcpclient(ip_client, port_android); byte[] notifi = system.text.encoding.ascii.getbytes(notif); networkstream stream = client.getstream(); stream.write(notifi, 0, notifi.length); stream.close(); client.close(); } i should note work both ways when on lan, code working, need modify can reach android targets on nats.
something this
class programme { int port_server = 42424; socket server_socket; public program() { server_socket = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp); server_socket.bind(new ipendpoint(ipaddress.any, port_server)); server_socket.listen(0); } public void listen() { while (true) { var client = server_socket.accept(); var buffer = new byte[client.receivebuffersize]; client.beginreceive(buffer, 0, buffer.length, socketflags.none, new asynccallback(receivecallback), tuple.create(client, buffer)); } } private void receivecallback(iasyncresult ar) { var state = (tuple<socket, byte[]>)ar.asyncstate; var client = state.item1; var buffer = state.item2; byte[] notifi = system.text.encoding.ascii.getbytes("take this"); client.send(notifi); client.close(); } static void main(string[] args) { var programm = new program(); programm.listen(); } } client part
using (socket client = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp)) { client.connect(new ipendpoint(ipaddress.parse("127.0.0.1"), 42424)); client.send(new byte[] {1, 2, 3}, socketflags.none); byte[] bt = new byte[256]; client.receive(bt, 256, socketflags.none); } java c# android sockets nat
No comments:
Post a Comment