2014-01-31 105 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,定時任務每2ms,10ms和100ms調用一個名爲TASK1,TASK2和TASK3的函數。那麼如何在後臺運行這些功能。請有人幫助我。如何並行運行任務?

+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變量存儲在數組或鏈接列表中。