【问题标题】:recv() goes into infinite looprecv() 进入无限循环
【发布时间】:2015-10-26 17:05:06
【问题描述】:

我正在尝试一次发送 4 个字节的文件,如果文件内容的长度不能被 4 整除,我会添加一些额外的空间并发送它

当我发送一些字符串时,它正在工作,但对于某些字符串,recv() 进入无限循环

客户端.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 ;
}

服务器.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 ;
}

发送或接收时是否有任何问题,有点卡在这一点上一段时间。

【问题讨论】:

  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topic 适用于此。请参阅MCVE,了解如何使您的问题达到标准。

标签: c++ string sockets


【解决方案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 返回的负值。

【讨论】:

    【解决方案2】:

    检查recv 的返回值是否有-ve 值。否则你会错过任何错误。

    这些调用返回接收到的字节数,如果发生错误,则返回 -1。当对端执行了有序关闭时,返回值为 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多