Если это ваш реальный код, у вас есть неправильные скобки в вызове bind. Один из двух в конце должен быть перемещен сразу после «sizeof (sin)».
Другими словами, измените его с:
if(bind(server, (sockaddr *)&sin, sizeof(sin) == SOCKET_ERROR))
до:
if(bind(server, (sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
Это небольшая ошибка C, не связанная с программированием сокетов, но иллюстрирующая, как нужно быть осторожным при использовании языка, который позволяет легко иметь синтаксически правильные операторы, которые семантически неверны.
Как у вас есть, он вычисляет «sizeof(sin) == SOCKET_ERROR
» (что всегда ложно (ноль), поскольку sizeof (что-то) всегда равно одному или нескольким, а SOCKET_ERROR всегда равно -1, по крайней мере для WinSock).
Затем он передает этот ноль в качестве третьего аргумента в bind (), который, естественно, жалуется, что вы не указали достаточно большой размер для структуры адреса.
И из-за этого bind () возвращает ненулевой код ошибки, поэтому ваш блок if выполняется.
Очень тонкий. Мое уважение к языку C остается высоким, хотя я использую его 20 с лишним лет - уважение в смысле «я уважаю львов, когда я в Серенгети», а не «я уважаю мнение моей жены»: -)