2015-12-05 4 views
0

У меня возникли проблемы с отправкой строки, по одному символу за один раз через соединение sock_stream. Причиной этого является то, что я пытаюсь отправить несколько строк, которые составляют около 70000 символов за раз. Кажется, что для функции записи, которую я пытался использовать, требуется строка.Как отправить строку, один символ за один раз через sock_stream

for(i=0;i<BUF_SIZE;i++) 
{ 
    write(sockfd,plaintext[i],1); 
    if(plaintext[i]=='0') 
     break; 
} 
write(sockfd,'^',sizeof(char)); 

Кроме того, как бы я прочитал это? Вот как я пытался это сделать.

int read_line(int fd,char message[]) 
{ 
    size_t message_len=0; 
    while (message_len<BUF_SIZE) 
    { 
     char c; 
     int ret = read(fd, &c, 1); 
     if (ret < 0) 
     { 
      message[message_len] = 0; 
      return len; // EOF reached 
     } 
     if (c == '^') 
     { 
      read(fd,&c,1); 
      message[message_len] = 0; 
      return message_len; // EOF reached 
     } 
     data[len++] = c; 
    } 
} 

Как бы это реализовать? Спасибо.

+0

Я уверен, что отправка одного персонажа за раз намного медленнее, чем отправка их навалом. –

+0

Я абсолютно уверен, что вы правы, но у меня есть несколько отправляемых сообщений, которые слишком велики для отправки навалом. Я могу сломать каждое сообщение после того, как будет достигнуто определенное количество символов, но для целей этого назначения кажется, что это просто вызовет больше возможностей для ошибок. – zdevita

ответ

0

Вам нужно изменить строку

write(sockfd,plaintext[i],1); 

к

write(sockfd,&plaintext[i],1); 

Кроме того, вы можете использовать

setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int)); 

, чтобы включить TCP_NODELAY вариант.

1

Подпись записи api: int write (int fd, const void * buf, size_t nbyte);

Так что вы можете сделать что-то вроде:

#define BUF_SIZE 70000 
char *buf = (char*)malloc(BUF_SIZE); 
int written = 0; 
int wrote; 
if (buf) 
    memset(buf, 1, BUF_SIZE); 
else 
    return written;//some error code 

while (written < BUF_SIZE) 
{ 
    wrote = write(fd, buf, BUF_SIZE); 
    if (wrote < 0) 
    return written; 
    written += wrote; 
} 

Точно так же вы должны попытаться сделать насыпную чтения, как чтение один символ в то время слишком медленно, если у вас есть очень веская причина. Каждый раз, когда вы пишете или читаете, его системный вызов и они дорогостоящие.

Таким образом, для чтения, вы можете попробовать что-то вроде

INT read_bytes = чтение (FD, ЬиЕ, BUF_SIZE);

и read_bytes будут иметь точное значение того, сколько вы прочитали.

Затем выполните parse_buf (buf), в котором вы можете найти тег, который вы ищете, а затем сохраните остальное на будущее, если вы получите больше данных, иначе, если вы получите меньше данных, а затем снова вызовите чтение.

Смежные вопросы