программирование udp winsock - PullRequest
       8

программирование udp winsock

0 голосов
/ 05 октября 2010

Я новичок в программировании сокетов.Я хочу получать пакеты udp непрерывно из порта.Для этого я создал сокет и используя вызовы bind и recv, которые я сделал со своей программойВ буфере я храню пакеты udp.Как получить пакет за пакетом.Как поставить условие для определенного временного интервала?Заранее спасибо.

static int recvData = 1;
sockID = socket(AF_INET, SOCK_DGRAM, 0);
 if(sockID < 0)
 {
  printf("Socket creation error\n");
        WSACleanup();
 }
 else
 {
  printf("Socket Created\n");
 }

 fepAddr.sin_family = AF_INET;
 fepAddr.sin_port = htons(inputData.portNo);
 fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr);

 if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR)
 {
  printf("bind() failed: %ld.\n", WSAGetLastError());
  closesocket(sockID);
  return 0;
 }

 else
 {
  printf("bind() is OK!\n");
 }

 memset(udpBuf,sizeof(udpBuf),0);
 while (recvData)
 {
  printf("receiving data\n");
  recvResult =  recvfrom( sockID, udpBuf, sizeof(udpBuf), 0,(struct sockaddr *)&fepAddr, &sock_len); 


  fprintf(udp, "%s", udpBuf);
  //fwrite(udpBuf, sizeof(udpBuf), 1, udp);
  recvData-- ;
 }
exit:
    if(udp) 
    {
         fclose(udp);
         udp = 0; 
    }

 //shutdown socket
 closesocket(sockID); 
 fclose(udp);

1 Ответ

1 голос
/ 06 октября 2010

recvfrom () получает данные UDP пакет за пакетом.Если данный пакет слишком велик, recvfrom () вернет ошибку.Что касается времени, вы можете использовать select (), чтобы узнать, когда сокет доступен для чтения.

Попробуйте что-то вроде этого:

sockID = socket(AF_INET, SOCK_DGRAM, 0); 
if (sockID == INVALID_SOCKET) 
{ 
  printf("Socket creation error\n"); 
  goto exit;
} 

printf("Socket Created\n"); 

memset(&fepAddr, 0, sizeof(fepAddr));
fepAddr.sin_family = AF_INET; 
fepAddr.sin_port = htons(inputData.portNo); 
fepAddr.sin_addr.s_addr = inet_addr(inputData.destIPAddr); 

if (bind(sockID, (struct sockaddr *)&fepAddr, sizeof(fepAddr)) == SOCKET_ERROR) 
{ 
  printf("bind() failed: %ld.\n", WSAGetLastError()); 
  goto exit;
} 

printf("bind() is OK!\n"); 

memset(udpBuf, 0, sizeof(udpBuf)); 

printf("receiving data\n"); 
while (...) 
{
  printf("."); 

  recvResult = recvfrom(sockID, udpBuf, sizeof(udpBuf), 0, (struct sockaddr *)&fepAddr, &addr_len);  
  if (recvResult == SOCKET_ERROR)
  {
    if (WSAGetLastError() != WSAEWOULDBLOCK)
    {
      printf("\nrecvfrom() failed: %ld.\n", WSAGetLastError()); 
      goto exit;
    }

    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(sockID, &fd);

    timeval t;
    t.tv_sec = ...; // seconds
    t.tv_usec = ...; // microseconds

    selectResult = select(0, &fd, NULL, NULL, &t);
    if (selectResult == SOCKET_ERROR)
    {
      printf("\nselect() failed: %ld.\n", WSAGetLastError()); 
      goto exit;
    }

    if (selectResult == 0)
    {
      printf("\nsocket timed out.\n");
      goto exit;
    }

    continue;
  }

  if (recvResult > 0)
    fwrite(udpBuf, recvResult, 1, udp); 
} 

exit: 
  if (udp != 0)
  { 
    fclose(udp); 
    udp = 0;  
  } 

  if (sockID != INVALID_SOCKET) 
  {
    closesocket(sockID);  
    sockID = INVALID_SOCKET;
  }
...