2015-10-26 2 views
1

Я пытаюсь отправить файл по 4 байта за раз, если длина содержимого файла не делится на 4, я добавляю дополнительное пространство, а я отправляю егоrecv() переходит в бесконечный цикл

Когда я отправить некоторые строки он работает, но для некоторой строки RECV() собирается в бесконечный цикл

client.cpp

#include <iostream> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 


using namespace std; 

int main(){ 

int ssock , csock ; 
struct sockaddr_in server ; 

server.sin_family = AF_INET ; 
server.sin_port = htons(8088); 
server.sin_addr.s_addr = inet_addr("127.0.0.1"); 


ssock = socket (AF_INET,SOCK_STREAM,0); 
if (ssock == -1) { 
       cout << " Error " ; return 0 ; 
     } 

connect(ssock , (sockaddr *)&server ,sizeof(server)); 
/*void *buff ; 
int len = recv(ssock , buff ,1024,0); 
int *ptr = (int *)buff ; 
cout << *ptr ;*/ 
void * buff ; 
int len; 
while(len = recv(ssock , buff ,4,0)){ 
     cout<<(char *)buff<<len<<"\n"; 


} 


    return 0 ; 
} 

server.cpp

#include <iostream> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <fstream> 
#include <cstring> 
#include <unistd.h> 


using namespace std; 

int main(){ 

int ssock , csock ; 
struct sockaddr_in server ; 

server.sin_family = AF_INET ; 
server.sin_port = htons(8088); 
server.sin_addr.s_addr = inet_addr("127.0.0.1"); 


ssock = socket (AF_INET,SOCK_STREAM,0); 
if (ssock == -1) { 
       cout << " Error " ; return 0 ; 
     } 

bind(ssock , (sockaddr *)&server ,sizeof(server)); 
listen(ssock,5); 
socklen_t size = sizeof (server); 
fstream fin("text.txt",ios::in); 
string s((istreambuf_iterator<char>(fin)),istreambuf_iterator<char>()); 
fin.close(); 
//cout<<s; 
int len = s.size(); 
if(len % 4 != 0) { 
     s.pop_back(); 
     int i = len % 4 ; 
     i = 4 - i ; 
     while(i){s.push_back(' ');i--;} 
     s.push_back('\0'); 
} 
cout<<s<<"\n"<<s.size()<<"\n"; 

while(csock = accept(ssock,(sockaddr *)&server ,&size)){ 

     cout<<"\n Connection Accpeted \n" ; 
     /*int s = 172; 
     send(csock , (void *)&s, sizeof(s),0);*/ 
     int i = 0; 

     i = 0 ; 
     while(i <= s.size()){ 
     string temp =s.substr(i,4); 
     cout<<temp<<"\n"; 
     cout<<send(csock,(void *)temp.c_str() ,4,0); 
     i+=4; 
     } 

     close(csock); 





} 

    return 0 ; 
} 

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

+1

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [по теме] (http://stackoverflow.com/help/on-topic). См. [MCVE] (http://stackoverflow.com/help/mcve) о том, как довести свой вопрос до стандартов. – Prune

ответ

0

проверить возвращаемое значение recv для значений -ve. в противном случае вы будете пропускать какие-либо ошибки.

Эти вызовы возвращают количество полученных байтов или -1, если произошла ошибка. Возвращаемое значение будет равно 0, когда сверстник выполнил упорядоченное завершение работы.

1
void * buff ; 
int len; 
while(len = recv(ssock , buff ,4,0)){ 
    cout<<(char *)buff<<len<<"\n"; 
} 

Есть по крайней мере три ошибки здесь:

  1. можно передать значение buff в recv, но вы не установили никакого значения. Значит, ты мусор.

  2. Когда вы передаете char * в cout, он должен быть строкой в ​​стиле C. Вы не можете использовать его для печати произвольных данных, полученных из соединения. Во-первых, как он узнает, сколько байтов для печати?

  3. Вы не обрабатываете отрицательные значения, возвращаемые recv.

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