Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WnSock2 и разрыв сервера

7.5K
25 июля 2012 года
diprom
37 / / 15.10.2010
Здравствуйте, скажите как получить клиенту, что сервер разорвал с ним соединение?
Вот код:

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>


#define PORT 5000
#define SERVERADDR "127.0.0.1"

int ConnectToServer()
{

char buff[1024];
printf("TCP DEMO CLIENT\n");

// Шаг 1 - инициализация библиотеки Winsock
if (WSAStartup(0x202,(WSADATA *)&buff[0]))
{
printf("WSAStart error %d\n",WSAGetLastError());
return -1;
}

// Шаг 2 - создание сокета
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_STREAM,0);
if (my_sock < 0)
{
printf("Socket() error %d\n",WSAGetLastError());
return -1;
}

// Шаг 3 - установка соединения

// заполнение структуры sockaddr_in
// указание адреса и порта сервера
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
HOSTENT *hst;

// преобразование IP адреса из символьного в
// сетевой формат
if (inet_addr(SERVERADDR)!=INADDR_NONE)
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
else
// попытка получить IP адрес по доменному
// имени сервера
if (hst=gethostbyname(SERVERADDR))
// hst->h_addr_list содержит не массив адресов,
// а массив указателей на адреса
((unsigned long *)&dest_addr.sin_addr)[0]=
((unsigned long **)hst->h_addr_list)[0][0];
else
{
printf("Invalid address %s\n",SERVERADDR);
closesocket(my_sock);
WSACleanup();
return -1;
}

// адрес сервера получен – пытаемся установить
// соединение
if (connect(my_sock,(sockaddr *)&dest_addr,
sizeof(dest_addr)))
{
printf("Connect error %d\n",WSAGetLastError());
return -1;
}

printf("Соединение с %s успешно установлено\n\",SERVERADDR);

// Шаг 4 - чтение и передача сообщений
int nsize;
while((nsize=recv(my_sock,&buff[0],
sizeof(buff)-1,0))
!=SOCKET_ERROR)
{
// ставим завершающий ноль в конце строки
buff[nsize]=0;

// выводим на экран
printf("%s",buff);

}

printf("Recv error %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;



}



int main(int argc, char* argv[])
{
int r = 0;
//если нет соединения с сервером - ждем
while(true)
{
r = ConnectToServer();

}

}
277
25 июля 2012 года
arrjj
1.7K / / 26.01.2011
Было:
 
Код:
while((nsize=recv(my_sock,&buff[0],
sizeof(buff)-1,0))
!=SOCKET_ERROR)
{
Стало:
Код:
while(true)
{
nsize=recv(my_sock,&buff[0],sizeof(buff)-1,0));
if(nsize==SOCKET_ERROR)
{
int err=WSAGetLastError();
switch(err)
{
//обработка ошибок
}
break;
}
7.5K
25 июля 2012 года
diprom
37 / / 15.10.2010
Для указания разрыва достаточно указать -
if (nsize == 0)
{


return -5;
}
Вопрос закрыт!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог