So this works fine...

func handleConnection(c net.Conn) {
// get user details
username := createUser(c, "Please enter you username (new users will be 
created / existing users will be loaded): ")
// map username to connection
var m = make(map[string]net.Conn)
m[username] = c
n := len(m)
fmt.Println(strconv.Itoa(n))

But due to the concurrent nature of the function ( I can't have player 1 
blocking player 2 ) the map only ever has details of your own 
connection...as seen from the output of len on the server...

$ go run game-server.go 6666
1
1

I guess I need to handle this outside of a goroutine...
On Saturday, September 12, 2020 at 7:55:34 AM UTC+1 Andy Hall wrote:

> I think this is exactly what I need to do...thanks very much. I'm looking 
> forward to implementing it.
>
> On Saturday, September 12, 2020 at 5:43:09 AM UTC+1 Shulhan wrote:
>
>>
>>
>> Pada tanggal Sab, 12 Sep 2020 02.54, Andy Hall <andyjo...@gmail.com> 
>> menulis:
>>
>>> if I have multiple clients connected to a tcp server and I wish to write 
>>> back to specific connections I can record the net.Conn value and then use 
>>> the Write method on it...but when using Println I get the following for two 
>>> clients...
>>>
>>> &{{0xc000094000}}
>>> &{{0xc000094080}}
>>>
>>> which when testing with a simple write doesn't work...
>>>
>>> package main
>>> import "net"
>>> var c net.Conn = "&{{0xc000094000}}"
>>> func writeConn(c net.Conn) {
>>> c.Write([]byte(string("Hello\n")))
>>> }
>>> func main() {
>>> writeConn(c)
>>> }
>>>
>>> ...and results in the following...
>>>
>>> cannot use "&{{0xc000094000}}" (type string) as type net.Conn in 
>>> assignment
>>>
>>> clearly using Println to output the net.Conn is not a viable var to use 
>>> so how could I do this ? I intend to record each users net.Conn in a 
>>> database which can then be queried as required.
>>>
>>> any help would be most greatly appreciated.
>>>
>>
>>
>> Either I miss something or Go has different socket concept, but last time 
>> I learn this is not how the network socket works in general.
>>
>> First, &{{0xc000094000}} is the address of a variable. You can't convert 
>> an address from string back to variable, because that would be security 
>> issue. Usually socket connection is signed integer, in C you can assign 
>> integer value to variable let other process write into it. But in Go, 
>> connection is an interface/structure.
>>
>> If you want to record each users, you have two options:
>>
>> 1) Let the user send unique ID (for example their user ID or email or 
>> username) on first accept.
>>
>> 2) Get unique ID from connection IP address (beware that two or more 
>> connection may come from the same IP address).
>>
>> You then must have a map that store unique ID as key and net.Conn as 
>> value. So, if you want to send some value to specific user, you query the 
>> map first and if exist then you can proceeds.
>>
>> I hope that helps.
>>
>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/c14d7e30-5ead-4e47-8987-710b25b4a91fn%40googlegroups.com.

Reply via email to