예제 #1
0
func (server *CspubResultServer) request_handler(conn net.Conn, out chan string) {
	for {
		_, resp, err := baidu.NsheadRead(conn)
		if err != nil {
			env.Log.Warn("read error " + err.Error())
			break
		}

		for _, receiver := range server.receivers {
			context := receiver.GetContextInterface()
			fetchResult := &CspubFetchResult{
				User_data: context,
			}
			if err := baidu.Unmarshal(resp, fetchResult); err != nil {
				env.Log.Warn("unmarshal resp %s error", string(resp))
				break
			}

			go receiver.HandleCspubResult(fetchResult)
		}
	}
}
예제 #2
0
func (client *CspubClient) Connect(addr string) *CspubError {
	for i := 0; i < client.Retry; i++ {
		conn, err := net.DialTimeout("tcp", addr,
			time.Duration(client.Timeout)*time.Second)
		if err != nil {
			log.Printf("connect to %s error (%d/%d): %s",
				addr, i+1, client.Retry, err.Error())
			continue
		}
		client.Connection = conn

		cslogin := CspubLogin{
			Username: client.Username,
			Userkey:  client.Userkey,
			Cmd_type: CMD_LOGIN,
			Priority: 0,
		}

		login_body, merr := baidu.Marshal(cslogin)
		if merr != nil {
			return &CspubError{"packing error: " + merr.Error()}
		}
		request := baidu.NsheadPack(login_body, 0)
		client.Connection.Write(request)
		_, response, cerr := baidu.NsheadRead(client.Connection)
		if cerr != nil {
			return &CspubError{"read pack error: " + cerr.Error()}
		}

		baidu.Unmarshal(response, &client.Cred)
		return nil
	}

	env.Log.Warn("connect to %s error after try %d times", addr, client.Retry)

	return &CspubError{"connect error"}
}