Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > [C++] Winsock и Потоки (Thread)


Автор: Scrolly 25.10.2007, 16:33
Код

#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 
Прикреплен файл сервера к которому происходит подключение.

Автор: JackYF 25.10.2007, 17:45
Scrolly, твой вопрос должен был быть задан в http://forum.vingrad.ru/forum/c-c++system-programming-WinAPI.html.

Автор: Scrolly 25.10.2007, 17:51
Извеняюсь... Тогда просьба админам перекинуть тему в WinApi, или затереть ее. Создам заново. Заранее спасибо.

Автор: AndreyK 25.10.2007, 19:39
надо ещё правильно организовать работу

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

Код

   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);

 


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


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

http://www.google.ru/search?q=CRITICAL_SECTION&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a опять сломался?  smile 

Автор: Scrolly 26.10.2007, 12:04
)))) Точно!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)