2014-05-19 6 views
4

이것은 더 기본적인 기본 관용구 문제이지만 좋은 예가됩니다. (BTW 100 % newb)유닉스 소켓 수신기를 만드는 방법

유닉스 소켓을 듣고 메시지를 처리하려고합니다. 다양한 장소에서 코드를 도난하지만 난 '캐스트'일 잘

package main 

import "fmt" 
import "net" 

func main(){ 
    ln,err := net.Listen("unix", "/var/service/daemon2") 
    if err!= nil { 
     fmt.Println(err) 
     return 
    } 

    for { 
     c, err := ln.Accept() 
     if err != nil { 
      fmt.Println(err) 
      continue 
     } 
    // handle the connection 
     go handleServerConnection(c) 
    } 


} 

func handleServerConnection(c net.UnixConn) { 
    // receive the message 
    buff := make([]byte, 1024) 
    oob := make([]byte, 1024) 

    _,_,_,_,err:=c.ReadMsgUnix(buff,oob); 
    if err != nil { 
     fmt.Println(err) 

    } 
} 

내가 ReadUNixMsg를 호출 할 수 있도록 형식 UNixConn의 수 handleServerConnection 내부에 'C'를 필요로 기운 다. 그러나 일반 리스닝 코드는 일반 Conn 객체를 만듭니다. 그래서이 코드는 컴파일되지 않습니다.

예를 들어 UnixConn (c)과 같이 다양한 변환/캐스트 유형의 것들을 시도했지만 모두 유용하지 않았습니다.

답변

7

캐스팅이 같은 연결 :

go handleServerConnection(c.(*net.UnixConn)) 

과에 함수의 서명을 변경 : 여기에서 발생 net.Listen 모든 리스너 소켓 구현 Listener 인터페이스를 반환 무엇

func handleServerConnection(c *net.UnixConn) { 

. 실제 객체는 Listener 인터페이스를 구현하는 net.UnixConn에 대한 포인터입니다. 이렇게하면 형식 어설 션/변환을 수행 할 수 있습니다. 객체가 실제로 유닉스 소켓이 아닌 경우에는 물론 실패합니다. 따라서 먼저 assertion을 검증하는 것이 좋습니다. http://golang.org/doc/effective_go.html#interface_conversions

+0

ty - 첫 번째 줄의 의미를 설명 할 수 있습니까? – pm100

+0

@ pm100 몇 가지 설명을 추가했지만, 기본적으로 인터페이스를 Go에서 구현하는 실제 유형으로 변환하는 방법입니다. –

0

을 또는 당신이 * net.UnixConn을 반환 AcceptUnix를 호출 할 수있는에 UnixListener을 반환 net.ListenUnix()를 사용할 수 있습니다

다음은이 물건에 대해 알아야 할 것입니다.

그러나 Not_a_Golfer 솔루션은 잘 작동 :) 당신이 찾고있는 것은 당신의 net.Listen 원하는 net.UnixConn 객체를 반환하는 net.ListenUnixgram("unix", net.ResolveUnixAddr("unix","/path/to/socket")로 교체하는 것입니다

관련 문제