Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программирование сокетов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Dubov
CODE
int main(int argc, char* argv[])
{
#ifdef WIN32
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2), &wsadata);
#endif

SOCKET s_server, s_client; // сокеты клиента и севера
sockaddr_in ssin; // адрес сокета
char * buffer = new char[1024]; // буфер данных
int len; // длина данных

// создаем сокет
s_server = socket(AF_INET, SOCK_STREAM, 0);
if (s_server == SOCKET_ERROR)
{
printf("Can't create socket.\n\rPush any button for exit.\n\r");
getchar();
return 0;
}
// формируем адрес сокета
ssin.sin_family = AF_INET;
ssin.sin_addr.s_addr = htonl(INADDR_ANY);
ssin.sin_port = htons(SRV_PORT);

// Привязываем сокет к адресу
if (bind(s_server, (sockaddr *)&ssin, sizeof(ssin)) == SOCKET_ERROR) //(sockaddr *)&ssin
{
printf("Can't bind socket to adress.\n\rPush any button for exit.\n\r");
getchar();
return 0;
}



// начинаем прослушку
listen(s_server, 5);
while(1)
{
// принимаем подключение
s_client = accept(s_server, NULL, NULL);
if (s_client == INVALID_SOCKET)
return 0;

// принимаем запрос от клиента
len = recv(s_client, buffer, MAXDATA, 0);
if (len == SOCKET_ERROR)
return 0;
buffer[len] = 0;

printf("%s\n",buffer);

// отправляем ответ
sprintf(buffer, "Got %d bytes of data.", len);
len = send(s_client, buffer, strlen(buffer), 0);
if (len == SOCKET_ERROR)
return 0;
// закрываем сокет
//closesocket(s_client);
shutdown(s_client, 1);
printf("Push any button for exit.");
getchar();
}

//closesocket(s_server);
shutdown(s_server, 1);
#ifdef WIN32
WSACleanup();
#endif
return 0;
}


программа завершается сообщение Can't bind socket to adress.

не могу понять почему. Код самый простой
XVR
Последний параметр в socket должен быть IPPROTO_TCP, а не 0.

Кстати, а какой код ошибки возвращает WSAGetLastError после bind?

И еще - htonl к INADDR_ANY применять не надо, он и так уже в правильном виде
Dubov
Цитата(XVR @ Mar 20 2014, 11:13) *
Кстати, а какой код ошибки возвращает WSAGetLastError после bind?

10048

исправил как вы рекомендовали

CODE
int main(int argc, char* argv[])
{
int i;
#ifdef WIN32
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2), &wsadata);
#endif

SOCKET s_server, s_client; // сокеты клиента и севера
sockaddr_in ssin; // адрес сокета
char * buffer = new char[1024]; // буфер данных
int len; // длина данных

// создаем сокет
s_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s_server == SOCKET_ERROR)
{
printf("Can't create socket.\n\rPush any button for exit.\n\r");
getchar();
return 0;
}
// формируем адрес сокета
ssin.sin_family = AF_INET;
ssin.sin_addr.s_addr = INADDR_ANY;
ssin.sin_port = htons(SRV_PORT);

// Привязываем сокет к адресу
if (bind(s_server, (sockaddr *)&ssin, sizeof(ssin)) == SOCKET_ERROR) //(sockaddr *)&ssin
//i = WSAGetLastError();
// printf( "%d\n", i);
{
printf("Can't bind socket to adress.\n\rPush any button for exit.\n\r");
getchar();
return 0;
}



// начинаем прослушку
listen(s_server, 5);
while(1)
{
// принимаем подключение
s_client = accept(s_server, NULL, NULL);
if (s_client == INVALID_SOCKET)
return 0;

// принимаем запрос от клиента
len = recv(s_client, buffer, MAXDATA, 0);
if (len == SOCKET_ERROR)
return 0;
buffer[len] = 0;

printf("%s\n",buffer);

// отправляем ответ
sprintf(buffer, "Got %d bytes of data.", len);
len = send(s_client, buffer, strlen(buffer), 0);
if (len == SOCKET_ERROR)
return 0;
// закрываем сокет
//closesocket(s_client);
shutdown(s_client, 1);
printf("Push any button for exit.");
getchar();
}

//closesocket(s_server);
shutdown(s_server, 1);
#ifdef WIN32
WSACleanup();
#endif
return 0;
}


результат тот же
XVR
10048 - Это код ошибки WSAEADDRINUSE
Цитата
// MessageId: WSAEADDRINUSE
//
// MessageText:
//
// Only one usage of each socket address (protocol/network address/port) is normally permitted.
//
#define WSAEADDRINUSE 10048L

У вас на этом порту уже кто то сидит.
Dubov
Цитата(XVR @ Mar 20 2014, 11:43) *
10048 - Это код ошибки WSAEADDRINUSE

У вас на этом порту уже кто то сидит.

спасибо, теперь порт задан как 8086
работет нормально
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.