Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2015, 19:29   #1
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию winsock чат

Добрый вечер!
Пытаюсь написать чат используя winsock. Но в серверном приложении функция wsarecv выдает ошибку WSA_IO_PENDING. Помогите пожалуйста разобраться

Код:
DWORD WINAPI ProcessIO(LPVOID lpParameter) {
DWORD Index;
	DWORD Flags;
	LPSOCKET_INFORMATION SI;
	DWORD BytesTransferred;
	DWORD i;
	DWORD RecvBytes, SendBytes;

	while (TRUE) {

		if ((Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE,
			WSA_INFINITE, FALSE)) == WSA_WAIT_FAILED) {
			printf("WSAWaitForMultipleEvents() failed %d\n", WSAGetLastError());
			system("pause");
			return 0;
		}

		// If the event triggered was zero then a connection attempt was made
		// on our listening socket.
		if ((Index - WSA_WAIT_EVENT_0) == 0) {
			WSAResetEvent(EventArray[0]);
			printf("Îæèäàíèå 
                                  èíñòðóêöèé îò
                                    îñíîâíîãî ïîòîêà...\n");
			continue;
		}

		SI = SocketArray[Index - WSA_WAIT_EVENT_0];
		WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]);

		if (WSAGetOverlappedResult(SI->Socket, &(SI->Overlapped),
			&BytesTransferred, FALSE, &Flags) == FALSE || BytesTransferred == 0)
		{
			printf("Çàêðûòèå ñîêåòà %d\n", 
                            SI->Socket);

			if (closesocket(SI->Socket) == SOCKET_ERROR) {
				printf("Îøèáêà ïðè 
                                   çàêðûòèè ñîêåòà %d\n", 
                                WSAGetLastError());
			}
			else
				printf("Ñîêåò óñïåøíî       
                                              çàêðûò!\n");

			GlobalFree(SI);
			WSACloseEvent(EventArray[Index - WSA_WAIT_EVENT_0]);

			// Î÷èñòêà î÷åðåäè
			EnterCriticalSection(&CriticalSection);

			if ((Index - WSA_WAIT_EVENT_0) + 1 != EventTotal)
				for (i = Index - WSA_WAIT_EVENT_0; i < EventTotal; i++) {
					EventArray[i] = EventArray[i + 1];
					SocketArray[i] = SocketArray[i + 1];
				}

			EventTotal--;
			LeaveCriticalSection(&CriticalSection);
			continue;
		}
		// Check to see if the BytesRECV field equals zero. If this is so, then
		// this means a WSARecv call just completed so update the BytesRECV field
		// with the BytesTransferred value from the completed WSARecv() call.
		if (SI->BytesRECV == 0) {
			SI->BytesRECV = BytesTransferred;
			SI->BytesSEND = 0;
		}
		else {
			SI->BytesSEND += BytesTransferred;
		}

	       if (SI->BytesRECV > SI->BytesSEND) {
			// Post another WSASend() request.
			// Since WSASend() is not guaranteed to send all of the bytes requested,
			// continue posting WSASend() calls until all received bytes are sent
			ZeroMemory(&(SI->Overlapped), sizeof(WSAOVERLAPPED));
			SI->Overlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];

			SI->DataBuf.buf = SI->Buffer + SI->BytesSEND;
			SI->DataBuf.len = SI->BytesRECV - SI->BytesSEND;

			char SendMessage[256];
			scanf("%s",SendMessage);
			 SI->DataBuf.buf= SendMessage;
			  SI->DataBuf.len=sizeof(SendMessage);

				if (WSASend(SI->Socket, &(SI->DataBuf), 1, &SendBytes, 0,
					&(SI->Overlapped), NULL) == SOCKET_ERROR) {
					if (WSAGetLastError() != ERROR_IO_PENDING) {
						printf("WSASend() failed with error %d\n",
							WSAGetLastError());
						return 0;
					}
				}
				else
				 printf("Îòïðàâëåíî %s \n", SI->DataBuf.buf);

		 	}

	       else {
			SI->BytesRECV = 0;
			// Now that there are no more bytes to send post another WSARecv() request
			Flags = 0;
			ZeroMemory(&(SI->Overlapped), sizeof(WSAOVERLAPPED));
			SI->Overlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0];

			SI->DataBuf.len = DATA_BUFSIZE;
			SI->DataBuf.buf = SI->Buffer;
                          int RR;
               RR=WSARecv(SI->Socket, &(SI->DataBuf), 1, &RecvBytes, &Flags,&(SI->Overlapped), NULL);// ЗДЕСЬ ОШИБКА
               	printf("%d",WSAGetLastError());
			if ( RR== SOCKET_ERROR) {
				if (WSAGetLastError() != ERROR_IO_PENDING) {
					printf("Îøèáêà ïðè¸ìà
                                                    äàííûõ. Êîä: %d\n",
					WSAGetLastError());
					system("pause");
					return 0;
				}
			}
		      if(RR==0)
				printf("Ïîëó÷åíî %s\n", SI->DataBuf.buf);
	      }
	}
}

Последний раз редактировалось Stilet; 08.05.2015 в 19:51.
Sv. вне форума Ответить с цитированием
Старый 08.05.2015, 20:07   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

WSA_IO_PENDING означает, что операция будет выполнятся асинхронно, т.е. это не есть ошибка, как таковая.
По завершении будет просигнален hEvent в OVERLAPPED структуре.
waleri вне форума Ответить с цитированием
Старый 09.05.2015, 10:34   #3
Sv.
Пользователь
 
Регистрация: 01.11.2012
Сообщений: 48
По умолчанию

А что делать? Никак не хочет выводить принятые данные. Если убрать всякие проверки, то выведет
И где можно почитать про перекрытый ввод вывод? Никак не могу разобраться
Sv. вне форума Ответить с цитированием
Старый 09.05.2015, 13:52   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточный чат на winsock btf Visual C++ 15 28.12.2012 06:15
Клиент-серверный чат на неблокируемых сокетах (winsock 1) Rin Работа с сетью в Delphi 27 19.12.2012 20:41
Winsock Чат Dizelektwo C/C++ Сетевое программирование 5 20.05.2012 08:59
Winsock Чат Dizelektwo C/C++ Сетевое программирование 0 18.05.2012 21:24
Чат через winsock Jasper92 Помощь студентам 0 23.11.2010 14:48