|
Member 4773987 wrote: The below code i found in some websites but it always return error Then I suggest you throw it away and use the Google documentation to understand how to use their API correctly.
|
|
|
|
|
Doesn't that mean ... learning stuff? Nobody does that any more, bro - just grab what you need from SO and chuck it together.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Thank you for your Help
🤣🤣🤣
|
|
|
|
|
I am trying to make two clients behind NAT communicates each other using a server with port forward working, my scenario:
Server start listering on port 45000 for Client_A connection;
Server Start listering on port 45001 for Client_B connection;
Client_A connect to server on port 45000 and send hello message;
Client_B connect to server on port 45001 and send hello message;
Server Receive hello message from Client_B and send message with Client_B external port (ex 56000) to Client_B;
Client_B receive external port and start listering on port 56000;
Server Receive hello message from Client_A and send message with Client_B IP and port to Client_A;
Client_A receive IP and Port of Client_B;
Client_A connect to Client_B and send hello message
The problem:
Client_B does not receive message from Client_A;
Here is code:
Server:
static int server_A_Port = 45000;
static int server_B_Port = 45001;
static UdpClient server_A;
static UdpClient server_B;
static bool client_B_Connected = false;
static string client_A_Ip = "";
static string client_B_Ip = "";
static int client_A_Port = 0;
static int client_B_Port = 0;
static Thread Server_A_Thread = new Thread(Start_Server_A);
static Thread Server_B_Thread = new Thread(Start_Server_B);
static void Main(string[] args)
{
Server_A_Thread.Start();
Server_B_Thread.Start();
}
static void Start_Server_A()
{
Console.WriteLine("Starting Server_A on port: " + server_A_Port);
server_A = new UdpClient();
IPEndPoint client_A_IpEp = new IPEndPoint(IPAddress.Any, server_A_Port);
server_A.Client.Bind(client_A_IpEp);
Console.WriteLine("Server Started. Waiting Client_A Message");
string c_a = "";
while (string.IsNullOrEmpty(c_a))
{
try
{
c_a = ReceiveMessageFromClient(server_A, ref client_A_IpEp);
Console.WriteLine("Message received from Client_A: " + c_a);
client_A_Ip = ((IPEndPoint)client_A_IpEp).Address.ToString();
client_A_Port = ((IPEndPoint)client_A_IpEp).Port;
server_A.Connect(client_A_IpEp);
}
catch(Exception err)
{
Thread.Sleep(1000);
}
}
Console.WriteLine("Waiting Client_B connection");
bool sended = false;
while (!sended)
{
if(client_B_Connected)
{
Console.WriteLine("Client_B connected, sending Client_B IP and Port to Client_A");
SendMessageToClient(server_A, client_B_Ip + ":" + client_B_Port);
sended = true;
Console.WriteLine("Message Sended to Client_A");
break;
}
Thread.Sleep(1000);
}
Console.ReadLine();
}
static void Start_Server_B()
{
Console.WriteLine("Starting Server_B on port: " + server_B_Port);
server_B = new UdpClient();
IPEndPoint client_B_IpEp = new IPEndPoint(IPAddress.Any, server_B_Port);
server_B.Client.Bind(client_B_IpEp);
Console.WriteLine("Server Started. Waiting Client_B Message");
string c_b = "";
while (string.IsNullOrEmpty(c_b))
{
try
{
c_b = ReceiveMessageFromClient(server_B, ref client_B_IpEp);
Console.WriteLine("Message received from Client_B: " + c_b);
client_B_Ip = ((IPEndPoint)client_B_IpEp).Address.ToString();
client_B_Port = ((IPEndPoint)client_B_IpEp).Port;
server_B.Connect(client_B_IpEp);
client_B_Connected = true;
}
catch (Exception err)
{
Thread.Sleep(1000);
}
}
Console.WriteLine("Sending external Port to Client_B start listering");
SendMessageToClient(server_B,client_B_Port + "");
}
static void SendMessageToClient(UdpClient client, string message)
{
byte[] data = Encoding.GetEncoding(28591).GetBytes(message);
client.Send(data, data.Length);
}
static string ReceiveMessageFromClient(UdpClient client, ref IPEndPoint ep)
{
byte[] data = client.Receive(ref ep);
string receivedString = Encoding.GetEncoding(28591).GetString(data);
return receivedString;
}
Client_A:
static string serverIp = "X.X.X.X";
static int serverPort = 45000;
static string otherClientIp = "0.0.0.0";
static int otherClientPort = 0;
static UdpClient client = new UdpClient();
static void Main(string[] args)
{
Console.WriteLine("Connecting to server...");
client.Connect(serverIp, serverPort);
Console.WriteLine("Connected. Sending request message...");
SendMessageToServer();
Console.WriteLine("Sended. Waiting response...");
string s = "";
while (string.IsNullOrEmpty(s))
{
try
{
s = ReceiveMessageFromServer();
Console.WriteLine("Response received from server.");
}
catch (Exception err)
{
Thread.Sleep(1000);
}
}
string[] otherClientInfo = s.Split(':');
otherClientIp = otherClientInfo[0];
otherClientPort = int.Parse(otherClientInfo[1]);
Console.WriteLine("Other Client info: " + otherClientIp + ":" + otherClientPort);
Thread.Sleep(2000);
Console.WriteLine("Connecting to Client_B...");
client.Connect(otherClientIp, otherClientPort);
Console.WriteLine("Connected. Sending hello hessage...");
SendMessageToClient();
Console.WriteLine("Sended. Waiting response...");
string c = "";
while (string.IsNullOrEmpty(c))
{
try
{
IPEndPoint ep = (IPEndPoint)client.Client.RemoteEndPoint;
c = ReceiveMessageFromClient(client,ref ep);
Console.WriteLine("Response received from Client_B.");
Console.WriteLine("Response: " + c);
Console.ReadLine();
}
catch (Exception err)
{
Thread.Sleep(1000);
}
}
}
static void SendMessageToServer()
{
byte[] data = Encoding.GetEncoding(28591).GetBytes("FROM CLIENT TO SERVER");
client.Send(data, data.Length);
}
static void SendMessageToClient()
{
byte[] data = Encoding.GetEncoding(28591).GetBytes("FROM CLIENT_A TO CLIENT_B");
client.Send(data, data.Length);
}
static string ReceiveMessageFromServer()
{
IPEndPoint serverIpEp = new IPEndPoint(IPAddress.Parse(serverIp), serverPort);
byte[] data = client.Receive(ref serverIpEp);
string receivedString = Encoding.GetEncoding(28591).GetString(data);
return receivedString;
}
static string ReceiveMessageFromClient(UdpClient server, ref IPEndPoint ep)
{
byte[] data = server.Receive(ref ep);
string receivedString = Encoding.GetEncoding(28591).GetString(data);
return receivedString;
}
Client_B:
static string serverIp = "X.X.X.X";
static int serverPort = 45001;
static UdpClient client = new UdpClient();
static void Main(string[] args)
{
Console.WriteLine("Connecting to server...");
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.Connect(serverIp, serverPort);
Console.WriteLine("Connected. Sending request message...");
SendMessageToServer();
Console.WriteLine("Sended. Waiting response...");
string s = "";
while (string.IsNullOrEmpty(s))
{
try
{
s = ReceiveMessageFromServer();
Console.WriteLine("Response received from server.");
}
catch (Exception err)
{
Thread.Sleep(1000);
}
}
Console.WriteLine("My External Port: " + s);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, int.Parse(s));
Console.WriteLine("Start Binding on Extenal Port: " + ep.Port);
UdpClient server = new UdpClient();
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Client.Bind(ep);
Console.WriteLine("Started. Waiting hello message...");
string c = "";
while (string.IsNullOrEmpty(c))
{
try
{
c = ReceiveMessageFromClient(server, ref ep);
Console.WriteLine("Response received from Client_A.");
Console.WriteLine("Response: " + c);
client.Connect(ep);
Console.ReadLine();
}
catch (Exception err)
{
}
}
Console.WriteLine("Sending message to Client_A...");
SendMessageToClient();
Console.WriteLine("Sended.");
Console.ReadLine();
var myRule = FirewallManager.Instance.Rules.SingleOrDefault(r => r.Name == "TEST_RULE");
FirewallManager.Instance.Rules.Remove(myRule);
}
static void SendMessageToServer()
{
byte[] data = Encoding.GetEncoding(28591).GetBytes("FROM CLIENT TO SERVER");
client.Send(data, data.Length);
}
static void SendMessageToClient()
{
byte[] data = Encoding.GetEncoding(28591).GetBytes("FROM CLIENT_B TO CLIENT_A");
client.Send(data, data.Length);
}
static string ReceiveMessageFromServer()
{
IPEndPoint serverIpEp = new IPEndPoint(IPAddress.Parse(serverIp), serverPort);
byte[] data = client.Receive(ref serverIpEp);
string receivedString = Encoding.GetEncoding(28591).GetString(data);
return receivedString;
}
static string ReceiveMessageFromClient(UdpClient server, ref IPEndPoint ep)
{
byte[] data = server.Receive(ref ep);
string receivedString = Encoding.GetEncoding(28591).GetString(data);
return receivedString;
}
modified 4-Jan-20 23:46pm.
|
|
|
|
|
It's "empty" on Client A as "server". (I think you should have just "one" server)
static void OnClientConnect(object obj)
{
}
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Sorry i have posted wrong code, now are correct.
|
|
|
|
|
Since NAT is involved, did you setup a rule in your NAT engine which allows clientB to directly connect to clientA, and vice-versa?
You should check the log of the NAT equipment and search for dropped or refused packets from clientB's network to clientA's network.
"Five fruits and vegetables a day? What a joke!
Personally, after the third watermelon, I'm full."
|
|
|
|
|
If i add rule to Port Forward external ports on Client_B and Client_A, the Client_B can successfully connect to Client_A.
But i need to make this work on nat routers that I don't have access to the settings so I need to make it work without port foward.
Checking the Router(Nat equipment) not show any info from dropped/refused packets but I think it's because it's not a good router.
Sorry for bad english.
|
|
|
|
|
If your software will have to work in environments where you cannot control the NAT configuration, then you will have to rethink the way it works: have each client talk to the server only, and let the server play the role of transmitting messages between clients.
"Five fruits and vegetables a day? What a joke!
Personally, after the third watermelon, I'm full."
|
|
|
|
|
phil.o wrote: If your software will have to work in environments where you cannot control the NAT configuration, then you will have to rethink the way it works: have each client talk to the server only, and let the server play the role of transmitting messages between clients.
I am trying to make a software like TeamViewer, Ammmy, anydesk and Logmein, need transfer screen image and mouse+key coordinates, doing this the way you said I won't be able to transfer the information fast enough
|
|
|
|
|
Your replies are not logical. Use a server thread and a client thread on each machine.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
This Code is only example not my program, i need just work TCP Punch Hole but i can't.
|
|
|
|
|
im an artist and i code for fun.
I just encounter a strange problem in my code and i had to debug it a lot to find this little bug.
Not a bug per say, but more like my way of using things (probably wrong). But now is an eye opener.
List<string> block = new List<string>();
List<string> temp = new List<string>();
void SomeEvent
{
block.Clear();
block.AddRange(temp);
block = temp;
}
I wanted the text from [temp] list to copy into [block] list.
My usual way of doing it, was as in code2. But it seems is a bad way.
Because when temp is cleared, also the block is cleared, like block is a pointer to the temp.
I only wanted a temporary transfer of data between the 2 lists and not a permanent attachment.
Yah... can you explain the real difference? I had to learn it the hard way i suppose.
|
|
|
|
|
When you do this:
block = temp; you don't copy the elements, you copy the reference.
In other words, you throw away both the existing value in block , and the actual ilist itself.
The AddRange method adds each individual item to the existing collection - if you like, it copies the collection instead of changing the references. Have a look at this: Using struct and class - what's that all about?[^] - it gets a little more advanced than you are asking at the moment, but the early stuff should help.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
The first case deals with items "in the bucket".
In the second, you're replacing the original "block bucket", and pointing it to the same bucket that temp is pointing to.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Perhaps this is poor planing on my part, a bad document model but I thought it was the right way to go. I'm trying to find "US" and "AK" in a collection of Mongo Documents that represent ship rates. I have a collection of Ship Rate documents that look like this.
{
"Carrier" : "USPS",
"US Mail First Class Package",
"Countries" : [
{
"Name" : "United States",
"Abbr" : "US",
"States" : [
"AL",
"AK",
"More states ..."
],
"Name" : "Canada",
"Abbr" : "CA",
"States" : [
"BC",
"ON"
]
}
}
With this code in my repository, I can get all the documents with "US" in countries, but I want to go one step further and qualify the state as well, in case I don't want to ship to Hawaii.
var results = new List<QuotedShipRates>();
var filter1 = Builders<WEBSITE_SHIPSERVICES>.Filter
.ElemMatch(c => c.Countries, c => c.Abbr == countryCode);
var shipRates = await _context.WebsiteShipServices.Find(filter1).ToListAsync();
foreach (var shipRate in shipRates)
{
results.Add(new QuotedShipRates()
{
Name = shipRate.Name,
Code = shipRate.Code,
Rate = 5.99M,
GuaranteedDate = DateTime.Now.AddDays(5)
});
}
I just can't figure out how to get deeper here, to go to the array within the array.
I wanted to make this AsQueryable at first, but couldn't figure out how to write an expression for it.
I'm aware Canada has provinces, and Japan has prefectures, etc. I don't know what else to call states at the moment. LOL
If it ain't broke don't fix it
Discover my world at jkirkerx.com
|
|
|
|
|
That's exactly how to do it. It's an array within an array (or more preferable IMHO, a list within a list). Define your classes, and then use newtonsoft.json to deserialize into your objects.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
Well that was uplifting!
At least I designed my model right.
If it ain't broke don't fix it
Discover my world at jkirkerx.com
|
|
|
|
|
This actually worked after modifying the document and taking out Hawaii.
I didn't think of it when I posted the first time, but it makes sense now.
I just appended && c.states.Contains(stateCode) to the filter.
I was hoping my model of states would work as like a continuous string of values.
var results = new List<QuotedShipRates>();
var filter1 = Builders<WEBSITE_SHIPSERVICES>.Filter
.ElemMatch(c => c.Countries, c => c.Abbr == countryCode && c.States.Contains(stateCode));<br />
var shipRates = await _context.WebsiteShipServices.Find(filter1).ToListAsync();
foreach (var shipRate in shipRates)
{
results.Add(new QuotedShipRates()
{
Name = shipRate.Name,
Code = shipRate.Code,
Alias = shipRate.Alias,
Rate = 5.99M,
GuaranteedDate = DateTime.Now.AddDays(shipRate.Days_Max),
Selected = false
});
}
If it ain't broke don't fix it
Discover my world at jkirkerx.com
|
|
|
|
|
|
Please don't repost if your question does not appear immediately: both of these went to moderation and required a human being to review them for publication. In order to prevent you being kicked off as a spammer, both had to be accepted, and then I have to clean up the spares. Have a little patience, please!
I've deleted the spare.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Hi,
I got issue with reading data with proper encoding from DBF file.
Can you please help me to fix it? I can already read it but I can't find a way how to read the stream and convert it on the fly. All internet findings are not enough for me to adjust my code properly.
Her is the the code I use to read with wrong encoding:
private void WczytajTabeleSubiekta(string nazwaTabeli, string parametr, string parametr2, out DataTable dt)
{
dt = new DataTable();
try
{
OleDbConnection oConn = new OleDbConnection("Provider=VFPOLEDB.1;" + "Data Source=" + subiektPath + @"\DBFS\" + nazwaTabeli + ";Collating Sequence=machine");
oConn.Open();
System.Data.OleDb.OleDbCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = "SELECT " + parametr + " FROM " + subiektPath + @"\DBFS\" + nazwaTabeli + " " + parametr2;
dt.Load(oCmd.ExecuteReader());
oConn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Błąd podczas wczytywania tabeli - " + nazwaTabeli + "\n" + ex.Message.ToString(), "Komunikat");
}
}
|
|
|
|
|
What do you mean by "proper encoding"? Are you getting any errors?
|
|
|
|
|