Thanks Martin...I'll be sure to add a mutex lock and unlock either
side of the map call...probably shouldn't have chosen a networked
multi-player game as my first project but I sure am learning a lot !!
It's a very fun language too.

On Sat, 12 Sep 2020 at 17:03, Martin Schnabel <m...@mb0.org> wrote:
>
> Hi Andy,
>
> a global map is the way to go, however writing an reading the map from 
> multiple go routines will fail (in your case different handle calls for 
> connections) because the map data structure is not safe for concurrent use 
> and must be coordinated. the way it is usually solved is by adding another 
> sync.Mutex (mutually exclusive) variable to ensure only one go routine at a 
> has access to the map.
>
> https://godoc.org/sync#Mutex
>
> just a heads up, have fun!
>
> On 9/12/20 2:46 PM, Andy Hall wrote:
>
> OK so I just moved the declaration of the map to the package itself which 
> makes it universal...all working as expected. Thanks.
>
> On Saturday, September 12, 2020 at 1:35:49 PM UTC+1 Andy Hall wrote:
>>
>> 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/eff5d382-7bc5-4f2e-9752-a3c850318c0fn%40googlegroups.com.

-- 
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/CAOp5WB43tBJyNzgHxhrg_PWAE3DikRJcVL9sHA2xhHEkJ4F8sA%40mail.gmail.com.

Reply via email to