mirror of
https://github.com/berlin-open-wireless-lab/DAWN.git
synced 2025-03-09 15:40:12 +00:00
network/tcpsocket: make sure every msg is complete before handle
This commit is contained in:
parent
50d347c233
commit
653ce9fa56
1 changed files with 51 additions and 23 deletions
|
@ -81,7 +81,9 @@ static void client_to_server_state(struct ustream *s) {
|
|||
|
||||
static void client_read_cb(struct ustream *s, int bytes) {
|
||||
char *str;
|
||||
int len;
|
||||
int len = 0;
|
||||
size_t final_len;
|
||||
int max_retry = 3, tried = 0;
|
||||
|
||||
do {
|
||||
str = ustream_get_read_buf(s, &len);
|
||||
|
@ -89,25 +91,39 @@ static void client_read_cb(struct ustream *s, int bytes) {
|
|||
break;
|
||||
|
||||
if (network_config.use_symm_enc) {
|
||||
char *base64_dec_str = malloc(B64_DECODE_LEN(strlen(str)));
|
||||
int base64_dec_length = b64_decode(str, base64_dec_str, B64_DECODE_LEN(strlen(str)));
|
||||
char *dec = gcrypt_decrypt_msg(base64_dec_str, base64_dec_length);
|
||||
|
||||
free(base64_dec_str);
|
||||
final_len = *(size_t*)str;
|
||||
if(len < final_len) {//not complete msg, wait for next recv
|
||||
fprintf(stderr,"not complete msg, len:%d, expected len:%d\n", len, final_len);
|
||||
if (tried++ == max_retry) {
|
||||
ustream_consume(s, len);
|
||||
return;//drop package
|
||||
}
|
||||
continue;
|
||||
}
|
||||
char *dec = gcrypt_decrypt_msg(str+sizeof(size_t), final_len-sizeof(size_t));
|
||||
|
||||
handle_network_msg(dec);
|
||||
free(dec);
|
||||
ustream_consume(s, final_len);//one msg is processed
|
||||
tried = 0;
|
||||
} else {
|
||||
handle_network_msg(str);
|
||||
final_len = *(size_t*)str;
|
||||
if(len < final_len){
|
||||
fprintf(stderr,"not complete msg, len:%d, expected len:%d\n", len, final_len);
|
||||
if (tried++ == max_retry) {
|
||||
ustream_consume(s, len);
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
char* msg = malloc(final_len);
|
||||
memcpy(msg, str+sizeof(size_t), final_len-sizeof(size_t));
|
||||
handle_network_msg(msg);
|
||||
ustream_consume(s, final_len);//one msg is processed
|
||||
free(msg);
|
||||
tried = 0;
|
||||
}
|
||||
|
||||
ustream_consume(s, len);
|
||||
|
||||
} while (1);
|
||||
|
||||
if (s->w.data_bytes > 256 && !ustream_read_blocked(s)) {
|
||||
fprintf(stderr, "Block read, bytes: %d\n", s->w.data_bytes);
|
||||
ustream_set_read_blocked(s, true);
|
||||
}
|
||||
} while(1);
|
||||
}
|
||||
|
||||
static void server_cb(struct uloop_fd *fd, unsigned int events) {
|
||||
|
@ -227,16 +243,19 @@ void send_tcp(char *msg) {
|
|||
print_tcp_array();
|
||||
if (network_config.use_symm_enc) {
|
||||
int length_enc;
|
||||
size_t msglen = strlen(msg);
|
||||
char *enc = gcrypt_encrypt_msg(msg, msglen + 1, &length_enc);
|
||||
size_t msglen = strlen(msg)+1;
|
||||
char *enc = gcrypt_encrypt_msg(msg, msglen, &length_enc);
|
||||
|
||||
char *base64_enc_str = malloc(B64_ENCODE_LEN(length_enc));
|
||||
size_t base64_enc_length = b64_encode(enc, length_enc, base64_enc_str, B64_ENCODE_LEN(length_enc));
|
||||
struct network_con_s *con;
|
||||
size_t final_len = length_enc + sizeof(size_t);
|
||||
char *final_str = malloc(final_len);
|
||||
size_t *msg_header = (size_t*)final_str;
|
||||
*msg_header = final_len;
|
||||
memcpy(final_str+sizeof(size_t), enc, length_enc);
|
||||
list_for_each_entry(con, &tcp_sock_list, list)
|
||||
{
|
||||
if (con->connected) {
|
||||
int len_ustream = ustream_write(&con->stream.stream, base64_enc_str, base64_enc_length, 0);
|
||||
int len_ustream = ustream_write(&con->stream.stream, final_str, final_len, 0);
|
||||
printf("Ustream send: %d\n", len_ustream);
|
||||
if (len_ustream <= 0) {
|
||||
fprintf(stderr,"Ustream error!\n");
|
||||
|
@ -246,20 +265,29 @@ void send_tcp(char *msg) {
|
|||
|
||||
}
|
||||
|
||||
free(base64_enc_str);
|
||||
free(final_str);
|
||||
free(enc);
|
||||
} else {
|
||||
size_t msglen = strlen(msg) + 1;
|
||||
size_t final_len = msglen + sizeof(size_t);
|
||||
char *final_str = malloc(final_len);
|
||||
size_t *msg_header = (size_t*)final_str;
|
||||
*msg_header = final_len;
|
||||
memcpy(final_str+sizeof(size_t), msg, msglen);
|
||||
struct network_con_s *con;
|
||||
|
||||
list_for_each_entry(con, &tcp_sock_list, list)
|
||||
{
|
||||
if (con->connected) {
|
||||
if (ustream_printf(&con->stream.stream, "%s", msg) == 0) {
|
||||
int len_ustream = ustream_write(&con->stream.stream, final_str, final_len, 0);
|
||||
printf("Ustream send: %d\n", len_ustream);
|
||||
if (len_ustream <= 0) {
|
||||
//TODO: ERROR HANDLING!
|
||||
fprintf(stderr,"Ustream error!\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
free(final_str);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue