Странная ошибка сегментации с сокетами в C с linux - PullRequest
0 голосов
/ 01 апреля 2020

В настоящее время все, что я пытаюсь сделать, это просто исправить ошибку сегментации для простого клиентского сокета, который я пытаюсь установить. Я получаю ошибку сегментации каждый раз на линии connect (), и я не уверен, почему. Я пробовал несколько различных реализаций инициализации всего для соединения, но мне не повезло, обойдя эту ошибку сегмента.

Вот клиент. C код:

/*LINUX socket initializations*/

#define DEFAULT_BUFLEN 512
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h> 
#include <errno.h>
int SendingSocket, portno;
struct hostent *server;
int iResult;
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
char response[10];


#define DEFAULT_PORT "2212"
#define DEFAULT_ADDRESS "127.0.0.1"

int main(int argc, char* argv[];) {
/*
* Initializing socket 
*/

struct sockaddr_in serv_addr;

portno = atoi(DEFAULT_PORT);


SendingSocket = socket(AF_INET, SOCK_STREAM, 0);
if (SendingSocket < 0) 
    error("ERROR opening socket");
server = gethostbyname(DEFAULT_ADDRESS);
if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);
}

memset(&serv_addr, '0',sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(22041);

printf("got it\n");

in_addr_t in_addr = inet_addr("127.0.0.1");
if(INADDR_NONE == in_addr) {
perror("inet_addr() failed");
exit(0);
}
serv_addr.sin_addr.s_addr = in_addr;


if (connect(SendingSocket,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { 
    error("ERROR connecting");
}

printf("socket is connected!");


}
    /*
    * END socket initialization
    */

Вот ошибка:

[asl@asl Bridge]$ ./socket
got it
./socket: Segmentation fault (core dumped)

Вот вывод из GDB:

/home/asl/Desktop/backup-4-1-20/Bridge/socket: 
Program received signal SIGSEGV, Segmentation fault.
strchrnul () at ../sysdeps/x86_64/strchrnul.S:34
34      movdqa  (%rdi), %xmm0

Я в настоящее время нахожусь в среде CentOS 6.8, если это помогает.

Почему это странное segfault исходя из стрчрнул? Я не могу найти какую-либо информацию от него. Я использую довольно старую ОС по определенным причинам ... есть ли пакет или что-то, что нужно обновить или это связано с моим кодом?

РЕДАКТИРОВАТЬ: Это выглядит так быть проблема с пакетами / что-то с моей ОС. Это не похоже на проблему с моим кодом. Я просто запустил этот код и успешно запустил его на моем Raspberry Pi, работающем Rasbian. Кто-нибудь имеет представление о том, что может быть проблема в CentOS?

1 Ответ

1 голос
/ 01 апреля 2020

Вы используете error() неправильно. Согласно справочным страницам, функция имеет формат void error(int status, int errnum, const char *format, ...);, но вы просто передаете строку. Возможно, вы намеревались использовать функцию perror()?

Кроме того, если это не было ошибкой копирования, у вас есть лишняя точка с запятой:

int main(int argc, char* argv[];) {
                               ^
...