C++ 套接字编程中发送数据时发生断开管道错误

C++ 套接字编程中发送数据时发生断开管道错误,c++,linux,sockets,C++,Linux,Sockets,我有一个通过internet连接到服务器的客户端源代码。 当我跟踪代码时,它会在编译器运行send代码时显示SIGPIPE错误。我的问题在哪里? 正如评论所说,我更改了发送方法,并使用strcpy。 但我又犯了一个错误 #include <QCoreApplication> #include <stdio.h> /* Standard input/output definitions */ #include <string.h> /* String fu

我有一个通过internet连接到服务器的客户端源代码。
当我跟踪代码时,它会在编译器运行send代码时显示SIGPIPE错误。我的问题在哪里?
正如评论所说,我更改了发送方法,并使用strcpy。
但我又犯了一个错误

#include <QCoreApplication>
#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <string>    /*To use string type*/
#include <iostream>
#include <string>
#include <QChar>
#include <stdlib.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <typeinfo>//for print the type typeid(a).name --> int
#include <string>
#include <arpa/inet.h>
#include <signal.h>
//#include <pthread.h> //make thread
using namespace std ;

//________________
#define bufsize 100
int sock;
struct sockaddr_in server;
string str;
char*     message = new char[bufsize];
char*     server_reply = new char[bufsize];
void RECV()
{
        memset(&server_reply,'\0',bufsize);
        int a=recv(sock , server_reply ,bufsize  , 0);
        cout<<a;
        if(server_reply[0]!='\0')
        cout<<server_reply<<endl;

}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);//0
    if (sock == -1)
    {
        printf("Could not create socket");
    }
    puts("Socket created");
    server.sin_addr.s_addr = inet_addr("example.com");//
    server.sin_family = AF_UNSPEC;//AF_INET;
    server.sin_port = htons( 3490 );


    //Connect to remote server
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        perror("connect failed. Error");
        return 1;
    }

    puts("Connected\n");
    puts("Bienvenido al Chatroom, puedes empezar a escribir en la sala!");

    strcpy(message,"Hi");
    signal(SIGPIPE, SIG_IGN);
    if((send(sock , message , strlen(message)+1 , 0))<0)
    {
        perror("send");
        exit(1);
    }
    RECV();   
    close(sock);
    return a.exec();
}
#包括
#包括/*标准输入/输出定义*/
#include/*字符串函数定义*/
#include/*UNIX标准函数定义*/
#包含/*文件控制定义*/
#包括/*错误号定义*/
#包括/*POSIX终端控制定义*/
#包含/*以使用字符串类型*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包含//用于打印类型typeid(a).name-->int
#包括
#包括
#包括
//#包括//make thread
使用名称空间std;
//________________
#定义bufsize 100
int袜子;
服务器中的结构sockaddr_;
字符串str;
char*message=新字符[bufsize];
char*server_reply=new char[bufsize];
void RECV()
{
memset(&server_reply,'\0',bufsize);
int a=recv(sock,server\u reply,bufsize,0);

cout在两个
memset
调用中,您传递的是指针的地址,而不是指针本身。因为
bufsize
100
,这些
memset
调用将损坏其他内存。在这一点上,可能会发生许多不好的事情

下面是我的代码版本,没有得到
SIGPIPE
。最值得注意的是
AF\u unsec
已更改为
AF\u INET

#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <signal.h>

#define bufsize 100

static int sock;
static char* message      = new char[bufsize];
static char* server_reply = new char[bufsize];

static void RECV(int sock)
{
  recv(sock, server_reply, bufsize, 0);

  printf("%s\n", server_reply);
}

int main(int argc, char *argv[])
{
  struct sockaddr_in server;

  message      = new char[bufsize];
  server_reply = new char[bufsize];

  sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (sock == -1)
  {
    printf("Could not create socket");
    return 1;
  }

  puts("Socket created");
  server.sin_addr.s_addr = inet_addr("93.184.216.34");
  server.sin_family = AF_INET;
  server.sin_port = htons( 80 );

  if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
  {
    perror("connect failed. Error");
    return 1;
  }

  puts("Connected\n");
  puts("Bienvenido al Chatroom, puedes empezar a escribir en la sala!");

  strcpy(message,"GET http://example.com/index.html HTTP/1.1\r\n\r\n");
  signal(SIGPIPE, SIG_IGN);

  if ((send(sock, message, strlen(message)+1, 0))<0)
  {
    perror("send");
    return 1;
  }

  puts("Sent\n");
  RECV(sock);
  close(sock);
  return 0;
}
#包括/*标准输入/输出定义*/
#include/*字符串函数定义*/
#include/*UNIX标准函数定义*/
#包括
#包括
#包括
#包括
#包括
#定义bufsize 100
静态int-sock;
静态字符*消息=新字符[bufsize];
静态字符*server_reply=新字符[bufsize];
静态void RECV(内部sock)
{
recv(sock,server\u reply,bufsize,0);
printf(“%s\n”,服务器应答);
}
int main(int argc,char*argv[])
{
服务器中的结构sockaddr_;
消息=新字符[bufsize];
server_reply=新字符[bufsize];
sock=套接字(AF_INET、sock流、IPPROTO_TCP);
如果(sock==-1)
{
printf(“无法创建套接字”);
返回1;
}
放置(“已创建套接字”);
server.sin_addr.s_addr=inet_addr(“93.184.216.34”);
server.sinu family=AF\u INET;
server.sin_port=htons(80);
if(connect(sock,(struct sockaddr*)&server,sizeof(server))<0
{
perror(“连接失败。错误”);
返回1;
}
放置(“已连接”);
puts(“Bienvenido al聊天室,puedes empezar a describir en la sala!”);
strcpy(消息,“获取http://example.com/index.html HTTP/1.1\r\n\r\n”);
信号(信号管、信号灯);

if((send(sock,message,strlen(message)+1,0))感谢您的回复。我将memset中的代码更改为“for(int I=0;我为什么要写一个循环?只需从
memset
调用中删除
&
。这就是给出的答案基本上的意思。您调用的
memset
不正确。我删除了
,但再次出错:(您根本不需要
memset()
,但这并不能回答问题。它应该作为注释发布。我删除了memset。但我再次出错。在()中,它们关闭套接字。但在我的代码和服务器中,我们不使用close(socket)