2014-01-15 4 views
0

Моя задача - получать данные через TCP-соединение от клиента, а затем отправлять те же значения обратно клиенту. Это базовый код, но я просто буду уверен, что p1 [i] имеет те же значения, что и p [i], и отправляет полученные данные клиенту, так как я не могу проверить его до завтра. Я только что включил коммуникационную часть с клиентом, а не установление соединения.Получение и отправка данных через TCP

int main(int argc , char *argv[]) 
{ 
    WSADATA wsa; 
    SOCKET s , new_socket; 
    struct sockaddr_in server , client; 
    int c; 
    char iResult; 
    char recvbuf[DEFAULT_BUFLEN]; 
    int recvbuflen = DEFAULT_BUFLEN; 
    char sendbuf [DEFAULT_BUFLEN]; 
    int sendbuflen = DEFAULT_BUFLEN; 
    unsigned int i; 
    uint8_t* p; 
    uint8_t* p1; 
    int x=0; 
    int q=0; 
    size_t len; 

    p = (uint8_t*)recvbuf; 
    len= iResult/sizeof(uint8_t); 

    do 
    { 
     iResult = recv(new_socket, recvbuf, recvbuflen, 0); 
     { 
      for(i=0; i<len; i++) 
      { 
       p[i]; 
      }  
     } 
     if(iResult == 0) 
     { 
      wprintf(L"Connection closed\n"); 
     } 
     else 
     { 
      wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
     } 
    } 
    while(iResult > 0); 

    // Send uint8_t back data to client 
    p1 = (uint8_t*)sendbuf; 

    iResult = send(new_socket, sendbuf, sendbuflen, 0); 
    { 
     for(q=0; q<len; q++) 
     { 
      p1[q] = p[q]; 
     } 
    } 

    return 0; 

    closesocket(new_socket); 
    WSACleanup(); 
    return 0; 
} 
+0

И ваш вопрос? – EJP

+0

Отправляет ли код полученные данные? –

ответ

2

Моя задача - получать данные через TCP-соединение от клиента, а затем отправлять те же значения обратно клиенту.

Это может быть ваша задача, но это не то, что делает ваш код на самом деле. Есть много проблем с кодом:

  1. iResult не инициализирован, когда len назначается, так что ваш цикл после recv() является недействительным. И сам цикл бесполезен, потому что он фактически ничего не делает.

  2. recv() возвращает >0 если получены байты, 0 на разъединении, и -1 об ошибке. Вы регистрируете >0 как ошибку, когда это действительно не так.

  3. вы не звоните send() до после того, как recv() сообщил об ошибке/отключении. Вам нужно переместить send() внутри цикла приема.

  4. Вы не копируете никаких данных из recvbuf в sendbuf перед тем как позвонить send(), чтобы вы отправляли случайный мусор. Вы копируете данные от recvbuf до sendbuf только после того, как send() был вызван, но вы по-прежнему используете недопустимое значение len, которое было рассчитано до того, как было вызвано recv(), так что теперь вы потенциально уничтожаете случайную память.

  5. Вы звоните return перед тем, как позвонить closesocket() или WSACleanup().

Если все, что вы хотите сделать, это эхо любые полученные данные в течение срока службы соединения, то попробуйте вместо этого:

int main(int argc , char *argv[]) 
{ 
    SOCKET new_socket; 
    int iResult, len; 
    char recvbuf[DEFAULT_BUFLEN]; 
    char *p; 

    // establish connection ... 

    do 
    { 
     iResult = recv(new_socket, recvbuf, sizeof(recvbuf), 0); 
     if(iResult < 0) 
     { 
      wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
      break; 
     } 

     if(iResult == 0) 
     { 
      wprintf(L"Connection closed\n"); 
      break; 
     } 

     p = recvbuf; 
     len = iResult; 

     do 
     { 
      iResult = send(new_socket, p, len, 0); 
      if(iResult <= 0) 
      { 
       wprintf(L"send failed with error: %d\n", WSAGetLastError()); 
       break; 
      } 

      p += iResult; 
      len -= iResult; 
     } 
     while(len > 0); 
    } 
    while (true); 

    closesocket(new_socket); 

    WSACleanup(); 

    return 0; 
} 
2

ли код отправить полученные данные обратно?

Нет, это не так, потому что он посылает из другого буфера, а также потому, что он игнорирует длину, возвращенную recv(), поэтому он может отправить произвольный мусор.

Большая часть кода не начинает иметь смысл:

for(i=0; i<len; i++) 
    { 
    p[i]; 
    } 

Это не завершала ровно ничего.

if(iResult == 0) 
    { 
     wprintf(L"Connection closed\n"); 
    } 
    else 
    { 
     wprintf(L"recv failed with error: %d\n", WSAGetLastError()); 
    } 

Вы печатаете сообщение об ошибке, даже если iResult > 0, что означает данные были получены и не было никакой ошибки.

for(q=0; q<len; q++) 
    { 
    p1[q] = p[q]; 
    } 

Опять же это не решает ровно ничего, потому что вы делаете это только перед выходом из метода, когда все переменные, объявленные в ней отпадет в любом случае.

+0

Большое спасибо за ответ. Почему это проблема для отправки из другого буфера? Я выполнил процедуру по этой ссылке: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx –

+0

@ user2292615: вы не копируете полученные данные в буфер, который вы отправляете. Ваш буфер отправки содержит случайный мусор, потому что вы никогда не инициализируете его. Существуют и другие проблемы с вашим кодом. –

+0

Невозможно отправить данные из второго буфера, если в * втором буфере есть какие-либо данные *. В этом случае нет. Просто мусор. Вы можете скопировать данные из буфера приема в буфер отправки, но почему бы просто не отправить из буфера приема и не сэкономить время? – EJP

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