C++ 套接字编程中发送数据时发生断开管道错误
我有一个通过internet连接到服务器的客户端源代码。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
当我跟踪代码时,它会在编译器运行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)