为什么我得到分段错误时,从客户端发送数据到服务器
Why am I getting segmentation fault when sending data from client to server?
我制作了一个接受4个参数的客户端服务器程序。输入文件,输出文件,IP添加,端口号。但是当我试图发送结束字符时,我得到分割错误。
server.cpp
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <fstream>
#include <iomanip>
using namespace std;
int main (int argc, char **argv)
{
int sock, cli, read_size, file_size; //cli socket descriptor
struct sockaddr_in server, client;
char *send_buffer;
char *fname;
unsigned int sock_len;
ofstream fout;
cout << "Initializing a Socketn";
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Socket: ");
close(sock);
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port = htons(7246);
server.sin_addr.s_addr = INADDR_ANY;
bzero(&server.sin_zero, 0);
sock_len = sizeof(struct sockaddr);
cout << "Binding a Socketn";
if((bind(sock, (struct sockaddr *)&server, sock_len)) == -1)
{
perror("Bind: ");
close(sock);
exit(-1);
}
cout << "Listeningn";
if((listen(sock, 5)) == -1)
{
perror("Listen: ");
}
//To accept connection and get data from server
while(1)
{
cout << "Waiting...";
if((cli = accept(sock, (struct sockaddr *)&client, &sock_len )) == -1)
{
perror("Accept: ");
close(sock);
exit(-1);
}
else
{
cout << "Server: Got connection from " << inet_ntoa(client.sin_addr) << endl;
file_size = recv(cli, fname, 100, 0);
cout << "nOpening filen";
fout.open(fname, ios::out | ios::app | ios::binary);
if(!fout)
{
cout << "Error opening the file " <<fname << endl;
close(sock);
exit(1);
}
}
cout << "Start nown";
//while((recv(cli, send_buffer, sizeof(send_buffer), 0)) != EOF)
//while(*send_buffer != EOF)
while(strcmp(send_buffer, "_EOF_") != 0)
{
recv(cli, send_buffer, 10, 0);
cout << "Receiving Msg...";
fout.write(send_buffer, sizeof(send_buffer));
/*if(*send_buffer == EOF) {
cout << "Data Receivedn";
close(sock);
break;
}*/
}
//fout.write(EOF, sizeof(EOF));
/*if(read_size == 0)
{
cout << "Client Disconnected";
}
else if(read_size == -1)
{
perror("Receive Failed");
close(sock);
}*/
// fout.write(eof, sizeof(eof()));
fout.close();
}
close(sock);
return 0;
}
也client.cpp /*
Authors: Manoj Parihar
Description: This program
*/
#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <fstream>
#include <iomanip>
#include <netdb.h>
using namespace std;
int main (int argc, char *argv[])
{
int sockfd, numbytes;
char *buf_msg;
struct sockaddr_in server_add;
struct hostent *he;
char *end = "_EOF_";
ifstream fin;
if(argc != 5)
{
perror("Credentials Incomplete... Try again");
exit(1);
}
/*if ((he = gethostbyname(argv[1])) == NULL) {
cout << "Cannot get hostname" << endl;
exit(1);
}*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
cout << "Socket Failure..." << endl;
close(sockfd);
exit(1);
}
memset(&server_add, 0, sizeof(server_add));
server_add.sin_family = AF_INET;
server_add.sin_port = htons(atoi(argv[4]));
server_add.sin_addr.s_addr = inet_addr(argv[3]);
bzero(&server_add.sin_zero, 0);
cout << "Trying to connectn";
if(connect(sockfd, (struct sockaddr *)&server_add, sizeof(struct sockaddr)) == -1)
{
perror("Connect Error");
close(sockfd);
exit(1);
}
else
cout << "sending filename...n";
send(sockfd, argv[2], strlen(argv[2]), 0);
cout << "opening: " << argv[1] << strlen(argv[1]) << endl;
fin.open (argv[1], ios::in | ios::app | ios::binary);
if(!fin)
{
cout << "Client: Error opening file" << endl;
close(sockfd);
exit(1);
}
while(!(fin.eof()))
{
fin.read(buf_msg, 10);
cout << buf_msg << sizeof(buf_msg) << endl;
if(send(sockfd, buf_msg, sizeof(buf_msg), 0) == -1)
{
cout << "Failure Sending Msg";
close(sockfd);
exit(1);
}
}
cout << "Sending end charactern";
if(send(sockfd, "_EOF_", 5, 0) == -1)
{
cout << "Endpoint not sentn";
close(sockfd);
exit(1);
}
//send(sockfd, -1, sizeof(int), 0)
cout << "Closing Client...";
close(sockfd);
return 0;
}
段错误意味着您的程序正在访问不适合它访问的内存位置。这通常意味着你的指针没有正确初始化,或者指向已经返回给操作系统的内存块。
在使用send_buff
和buf_msg
之前,必须为它们分配内存。
void* malloc (size_t size);
分配内存块
分配一个大小字节的内存块,返回一个指向该块开头的指针。
类似:
char *send_buff = malloc(1024);
char *buf_msg = malloc(1024);
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 将相机数据从服务器实时流式传输到客户端
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- Java 客户端C++服务器数据发送/接收问题
- 如何从客户端在 gsoap C++ 的标头中传递非 xml 数据?
- 将数据发送到多个客户端 UDP 时不支持地址族
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 在 MySQL 中运行 HTTP 服务器以从客户端接收数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用 asio 本地数据报构建回显服务器和客户端?
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 通过TCP将数据从C++客户端发送到JSON服务器
- 如何使客户端在将数据写入 C++ 管道之前检查服务器是否完成了从管道的读取操作
- C++中从客户端到服务器的数据传输问题
- Qt TCP服务器不从客户端读取数据
- gpsd客户端数据缓冲区
- c++多线程套接字无法接收客户端数据