Sorry. I should say it crashed "the client on the server side due to payload decode failure"
Your mosquitto broker is healthy :) On Mar 18, 2013, at 6:40 PM, Roger Light <ro...@atchoo.org> wrote: > Hi Horace, > > I presume you intended this to come to the list rather than just me. > >> I tried to pass a Chinese NSString to this method, it actually crashed the >> server again, Payload print out as ?. > > It crashed mosquitto the broker? I'm definitely interested in that! > >> So I think the problem happens either >> when this method creating the payload (using NSUTF8StringEncoding) or when >> the arguments are passed. I noticed it used [payload length] which is >> calculating how many char in the string text, is it ok? or it should >> actually using the length of cstrPayload, which is the UTF8 coded CString? > > Ultimately the payload length needs to be the number of bytes in > cstrPayload, so it seems quite likely you are right that this is where > the error is occurring. > > Cheers, > > Roger > > > On Mon, Mar 18, 2013 at 7:50 AM, horace <contactyunk...@gmail.com> wrote: >> Thanks a lot for the help Roger. >> >> I tried your code on my server, it works smoothly. all Chinese char are >> displayed correctly. So I start to guess it may caused by the payload string >> sent from my iPhone app. >> >> I am using this wrapper on iPhone to use the libmosquitto (1.1.3): >> https://github.com/horacex/marquette >> >> I noticed in the MosquittoClient class, the publish method looks like this: >> https://github.com/horacex/marquette/blob/master/Classes/MosquittoClient.m#L156 >> >> - (void)publishString: (NSString *)payload toTopic:(NSString *)topic >> withQos:(NSUInteger)qos retain:(BOOL)retain { >> const char* cstrTopic = [topic >> cStringUsingEncoding:NSUTF8StringEncoding]; >> const uint8_t* cstrPayload = (const uint8_t*)[payload >> cStringUsingEncoding:NSUTF8StringEncoding]; >> mosquitto_publish(mosq, NULL, cstrTopic, [payload length], cstrPayload, >> qos, retain); >> >> } >> >> I tried to pass a Chinese NSString to this method, it actually crashed the >> server again, Payload print out as ?. So I think the problem happens either >> when this method creating the payload (using NSUTF8StringEncoding) or when >> the arguments are passed. I noticed it used [payload length] which is >> calculating how many char in the string text, is it ok? or it should >> actually using the length of cstrPayload, which is the UTF8 coded CString? >> >> Will do some test. >> >> >> int mosquitto_publish(struct mosquitto *mosq, int *mid, const char *topic, >> int payloadlen, const void *payload, int qos, bool retain) >> { >> struct mosquitto_message_all *message; >> uint16_t local_mid; >> >> if(!mosq || !topic || qos<0 || qos>2) return MOSQ_ERR_INVAL; >> if(strlen(topic) == 0) return MOSQ_ERR_INVAL; >> if(payloadlen < 0 || payloadlen > MQTT_MAX_PAYLOAD) return >> MOSQ_ERR_PAYLOAD_SIZE; >> >> if(_mosquitto_topic_wildcard_len_check(topic) != MOSQ_ERR_SUCCESS){ >> return MOSQ_ERR_INVAL; >> } >> >> local_mid = _mosquitto_mid_generate(mosq); >> if(mid){ >> *mid = local_mid; >> } >> >> if(qos == 0){ >> return _mosquitto_send_publish(mosq, local_mid, topic, payloadlen, payload, >> qos, retain, false); >> }else{ >> message = _mosquitto_calloc(1, sizeof(struct mosquitto_message_all)); >> if(!message) return MOSQ_ERR_NOMEM; >> >> message->next = NULL; >> message->timestamp = time(NULL); >> message->direction = mosq_md_out; >> if(qos == 1){ >> message->state = mosq_ms_wait_puback; >> }else if(qos == 2){ >> message->state = mosq_ms_wait_pubrec; >> } >> message->msg.mid = local_mid; >> message->msg.topic = _mosquitto_strdup(topic); >> if(!message->msg.topic){ >> _mosquitto_message_cleanup(&message); >> return MOSQ_ERR_NOMEM; >> } >> if(payloadlen){ >> message->msg.payloadlen = payloadlen; >> message->msg.payload = _mosquitto_malloc(payloadlen*sizeof(uint8_t)); >> if(!message->msg.payload){ >> _mosquitto_message_cleanup(&message); >> return MOSQ_ERR_NOMEM; >> } >> memcpy(message->msg.payload, payload, payloadlen*sizeof(uint8_t)); >> }else{ >> message->msg.payloadlen = 0; >> message->msg.payload = NULL; >> } >> message->msg.qos = qos; >> message->msg.retain = retain; >> message->dup = false; >> >> _mosquitto_message_queue(mosq, message); >> return _mosquitto_send_publish(mosq, message->msg.mid, message->msg.topic, >> message->msg.payloadlen, message->msg.payload, message->msg.qos, >> message->msg.retain, message->dup); >> } >> } >> >> >> On Mar 18, 2013, at 1:01 AM, Roger Light <ro...@atchoo.org> wrote: >> >> Hi Horace, >> >> Is there any chance you could post a non-working demo? I've just put >> together an example that works: https://gist.github.com/oojah/5182443 >> Could you give that a try as well? It would be good to know where >> things are going wrong. >> >> Regards, >> >> Roger >> >> -- Mailing list: https://launchpad.net/~mosquitto-users Post to : mosquitto-users@lists.launchpad.net Unsubscribe : https://launchpad.net/~mosquitto-users More help : https://help.launchpad.net/ListHelp