Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Winsock и Потоки (Thread), Отправка сообщения в отдельном потоке 
:(
    Опции темы
Scrolly
Дата 25.10.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Код

#include "stdafx.h"
#include "windows.h"
#include "winsock.h"
#include "iostream"


#define serverip "127.0.0.1"
DWORD WINAPI Threadproc(LPVOID tcp_servers);

char buff[1024];
using namespace std;

int main(){
    if (WSAStartup(0x202,(WSAData *)&buff))
    {cout<< "Error on Initialasing";
    WSACleanup();
    return -1;
    }
 SOCKET tcp_servers;
 tcp_servers=socket(AF_INET,SOCK_STREAM,0);
 if (tcp_servers<0)
 {
   cout<<"Error on Socket Creation ";
   WSACleanup();
   closesocket(tcp_servers);
 return -1;
 }
sockaddr_in servaddres;
 __try
 {
   servaddres.sin_family=(AF_INET);
   servaddres.sin_port=htons(10);
   servaddres.sin_addr.s_addr=inet_addr(serverip);
 }
 __except (EXCEPTION_EXECUTE_HANDLER)
 {
    cout<<"Error on Enqeue data to struct ";
    WSACleanup();
    closesocket(tcp_servers);
  return -1;
 }
     connect(tcp_servers,(sockaddr *)&servaddres,sizeof(servaddres));
     DWORD thID;

   CreateThread(NULL,0,Threadproc,&tcp_servers,0,&thID);
       if (thID==NULL){
     cout<<"Thread Creation error";
     cin.get();
       }      
}

DWORD WINAPI Threadproc(LPVOID tcp_servers){
SOCKET m_sock;
m_sock=((SOCKET *)tcp_servers)[0];

send(m_sock,"say hellow",sizeof("say hellow"),0);

return 0;

}

Программа пытается отправить сообщение, текстовое, используя сокеты. Я хотел бы саму процедуру отправки с помощью функции send 
запустить в отдельном потоке, как следствие не чего не получается. Если же не использовать поток, то все проходит отлично...  smile 
Прикреплен файл сервера к которому происходит подключение.

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  socket_server.rar 28,25 Kb
PM MAIL ICQ   Вверх
JackYF
Дата 25.10.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Scrolly, твой вопрос должен был быть задан в соседнем разделе.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Scrolly
Дата 25.10.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Извеняюсь... Тогда просьба админам перекинуть тему в WinApi, или затереть ее. Создам заново. Заранее спасибо.
PM MAIL ICQ   Вверх
AndreyK
Дата 25.10.2007, 19:39 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



надо ещё правильно организовать работу

Например синхронизировать поток с кодом основной программы:

Код

   DWORD WINAPI Threadproc(LPVOID tcp_servers){
...
    WaitForSingleObject(signConnectStart,INFINITE);
...
   send(...)
...
    SetEvent(signConnectEnd);




Функция WaitForSingleObject ждёт команды от основной программы, что всё в порядке и можно начинать передавать, а затем сама сообщает основной программе, что передача завершена и можно закрывать сокет (функцией SetEvent ).
Но лучше и сам сокет открывать и закрывать в потоке.

А основная программа тоже должна быть зацикленна и не завершаться, пока поток не прекратит работу.
Примерно так:
Код

HANDLE signConnectStart;
HANDLE signConnectEnd;

void main() {
...
    signConnectStart = CreateEvent(NULL,true,false,NULL);
    signConnectEnd = CreateEvent(NULL,true,false,NULL);
    ResetEvent(signConnectStart);
    ResetEvent(signConnectEnd);
...
    CreateThread(...)
...
    SetEvent(signConnectStart); //разрешение на отправку сообщения
 ...
    // какая-то работа

    WaitForSingleObject(signConnectEnd,INFINITE); 



Если из кода потока и основного потока идёт обращение к общим переменным, то надо при помощи тех-же WaitForSingleObject SetEvent и ResetEvent организовать поочерёдную работу потоков во время работы с этими переменными.
Т.е. все потоки ждут, пока какой-то один не закончит работу с этими переменными...


PS
А нет ... синхронизацию доступа лучше проводить при помощи функций:
Код

  EnterCriticalSection(&csss); // вызвать перед тем как обращаться к общим переменным

и
Код

  LeaveCriticalSection(&csss); //после


а секция инициализируется так:
Код

CRITICAL_SECTION csss;  
...
  InitializeCriticalSection(&csss);
...
//в конце
  DeleteCriticalSection(&csss);

 



Это сообщение отредактировал(а) AndreyK - 25.10.2007, 19:54
PM MAIL   Вверх
Scrolly
Дата 26.10.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



Спасибо, работает. Только вот про CRITICAL_SECTION csss; не вовсем понял, где об этом подробнее можно почитать? мб ссылка есть?


PM MAIL ICQ   Вверх
zkv
Дата 26.10.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Scrolly @  26.10.2007,  10:09 Найти цитируемый пост)
Только вот про CRITICAL_SECTION csss; не вовсем понял, где об этом подробнее можно почитать?

google опять сломался?  smile 
PM MAIL   Вверх
Scrolly
Дата 26.10.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 16.3.2006

Репутация: нет
Всего: нет



)))) Точно!)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.