如何并行运行任务?

时间:2014-01-31 07:53:13

标签: c multithreading sockets winapi timer

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,timer任务每隔2ms,10ms和100ms调用一个名为TASK1,TASK2和TASK3的函数。那么如何在后台运行这些功能。请有人帮助我。

1 个答案:

答案 0 :(得分:0)

如果要并行运行,可以使用线程进行多线程处理,或者使用forks进行多处理。

以下是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 - 变量存储在数组或链接列表中。

相关问题