write всегда пишет столько, сколько указано, или блокирует поток
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{
int s = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr = {
.sin_family = AF_INET,
.sin_port = htons(12345),
.sin_addr = inet_addr("127.0.0.1"),
};
ssize_t wr;
static char buf[100000000];
connect(s, (struct sockaddr *)&addr, sizeof(addr));
wr = send(s, buf, sizeof(buf), 0);
printf("%ld\n", wr);
}nc -l -p 12345 | head -c 1 > /dev/null$ gcc write-long.c -o write-long
$ ./write-long
2619280Но в любом случае - это не "линия" связи. ... Тем более не выделенная
$ xxd -r | sha1sum
0 c7 6f 17 f1 91 05 de 28 39 da b1 ea a2 a2 98 56
10 3d 67 df 21
8bb986c5259323914d0b68d0748430bf0cc31a63 -Собственно в чем потенциально может быть проблема?
-g компилятору и линковщику если линкуешь отдельным шагом) и дай санитайзеру самому сказать тебе, где проблема -- вместо /workspace/test+0x42590b он покажет тебе конкретно исходник и номер строки.
Алексей Лашко, ты вылез за пределы массива и перетёр то что там было, вот так. В этой функции нет никаких данных после массива name, сам массив лежит на стеке, ты можешь зачитать в него дофига данных и напечатать их и всё будет работать. До тех пор, пока дело не дойдёт до
return 0;. В этом месте тебя ожидает сюрприз, потому что достаточно длинная строка перепишет адрес возврата и ты вернёшься неизвестно куда, где, скорее всего, получишь сегфолт и программа завершится.scanf достаточно мощная функция чтобы предотвратить это, в строке формата можно указать максимальную ширину поля и scanf не станет читать больше данных чем там указано. Например так:
scanf("%1023[^\n]", name);Кроме того, если исходную программу ты соберёшь с каким-нибудь
-fsanitize=addressона сломается в месте вызова scanf если ты дашь ей больше 1023 символов на вход.