在套接字编程中发送数据时出现BrokenPipe错误

时间:2016-01-09 06:58:14

标签: c++ linux sockets

我有一个客户端源代码,通过互联网连接到服务器 当我跟踪代码时,它会在编译器运行发送代码时向我显示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();
}

1 个答案:

答案 0 :(得分:0)

在两个if (r.test(pin) && (pin.length == 4 || pin.length == 6)) { 调用中,您传递的是指针的地址而不是指针本身。由于memsetbufsize,因此这些100调用会破坏其他内存。那时,任何数量的坏事都可能发生。

以下是我的代码版本,但未获得memset。最值得注意的是,SIGPIPE已更改为AF_UNSPEC

AF_INET