2014-01-31 5 views
0
int CreateSocket() 
{ 




// SOCKET connectedSocket; 
// SOCKADDR_IN addr; 

// char buf[256]; 
// char buf2[300]; 
    // Winsock starten 
    HANDLE h1,h2,h3; 

double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster ; 
long rc; 
SOCKET acceptSocket; 



    rc=startWinsock(); 
    if(rc!=0) 

    { 

    printf("Fehler: startWinsock, fehler code: %d\n",rc); 

    return 1; 

    } 

    else 

    { 

    printf("Winsock gestartet!\n"); 

    } 

    // Socket erstellen 

    acceptSocket=socket(AF_INET,SOCK_STREAM,0); 

    if(acceptSocket==INVALID_SOCKET) 

    { 

    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); 

    return 1; 

    } 

    else 

    { 

    printf("Socket erstellt!\n"); 

    } 

memset(&addr,0,sizeof(SOCKADDR_IN)); 

addr.sin_family=AF_INET; 

addr.sin_port=htons(port); 

addr.sin_addr.s_addr=htonl(INADDR_ANY); 

rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); 

if(rc==SOCKET_ERROR) 

{ 

    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); 

    return 1; 

} 

else 

{ 

    printf("Socket an port %d gebunden\n",port); 

} 


rc=listen(acceptSocket,10); 

if(rc==SOCKET_ERROR) 

{ 

    printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); 

    return 1; 

} 

else 

{ 

    printf("acceptSocket ist im listen Modus....\n"); 

} 

connectedSocket=accept(acceptSocket,NULL,NULL); 

if(connectedSocket==INVALID_SOCKET) 

{ 

    printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); 

    return 1; 

} 

else 

{ 

    printf("Neue Verbindung wurde akzeptiert!\n"); 

// strcpy(buf,"Hallo wie gehts?"); 

// rc=send(acceptSocket,buf,9,0); 

     // Daten austauschen 
    while(rc!=SOCKET_ERROR) 
    { 
    rc=recv(connectedSocket,buf,256,0); 
    if(rc==0) 
    { 
     printf("Server hat die Verbindung getrennt..\n"); 
     break; 
    } 
    if(rc==SOCKET_ERROR) 
    { 
     printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); 
     break; 
    } 
    XcpIp_RxCallback((uint16) rc, (uint8*) buf, (uint16) port); 


h1=TimerTask(2,TASK1,&Task2ms_Raster); 
h2=TimerTask(10,TASK2,&Task10ms_Raster); 
h3=TimerTask(100,TASK3,&Task100ms_Raster); 


    } 
} 
    closesocket(acceptSocket); 
    closesocket(connectedSocket); 
    XcpIp_OnTcpCxnClosed((uint16) port); 
    WSACleanup(); 
    return 0; 
} 

Приведенный выше код является кодом сервера и принимает соединение от клиента через IP-адрес и номер порта. Я принимаю соединение и получаю данные от клиента. Я хочу запустить TimerTask в фоновом режиме, задача таймера вызывает функцию TASK1, TASK2 и TASK3 на каждые 2 мс, 10 мс и 100 мс. Итак, как запустить эту функцию в фоновом режиме. Пожалуйста, помогите мне.как запустить задачу параллельно?

+0

Что значит «работает в фоновом режиме»? Должно ли окно быть невидимым в Windows или вам нужно 2 потока/процессов, которые работают одновременно? – maja

+0

Он должен работать параллельно с получением данных. – user3252048

ответ

0

Если вы хотите, чтобы все работало параллельно, вы можете использовать потоки для многопоточности или вилки для многопроцессорной обработки.

Вот пример для многопоточности в C:

#include <pthread.h> 

void handleClient(SOCKET clientSock) 
{ 
... read and write ... 
} 

int main() 
{ 
    ... prepare the server ... 
    ... listen on socket ... 
    for(;;){ 
     connectedSocket=accept(acceptSocket,NULL,NULL);   
     pthread_t *tid = malloc(sizeof(pthread_t)); 
     pthread_create(&tid, NULL, handleClient, connectSocket); 

     ... test, if the server should be killed, and break the loop ... 
    } 
} 

Обратите внимание, что это очень минималистичный пример. Вы также должны заботиться о «собирании ваших потоков» с помощью pthread_join(tid, NULL);, таким образом, вы должны хранить все свои pthread_t -Variables внутри массива или связанного списка.

Смежные вопросы