linux C 中套接字的奇怪分段错误
Weird Segmentation fault with Sockets in C with linux
目前我正在尝试做的只是修复我正在尝试建立的简单客户端套接字连接的分段错误。我每次都在 connect() 行遇到分段错误,我不确定为什么。我已经尝试了多种不同的初始化所有连接的实现,但是没有运气绕过这个段错误。
这是Client.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 环境中,如果有帮助的话。
为什么这个奇怪的段错误来自 strchrnul?我无法从中找到任何信息。由于某些原因,我使用的是相当旧的 OS...是否有需要更新的包或其他东西,或者这与我的代码有关?
编辑: 这看起来像是 packages/something 和我的 OS 的问题。这似乎不是我的代码的问题。我只是 运行 这段代码 运行 它在我的 raspberry pi 运行 raspbian 上成功了。有人知道 CentOS 中的问题是什么吗?
您使用的 error()
不正确。根据手册页,该函数的格式为 void error(int status, int errnum, const char *format, ...);
,但您只是传递一个字符串。也许您打算使用 perror()
函数?
此外,如果不是复制错误,则您有一个无关的分号:
int main(int argc, char* argv[];) {
^
目前我正在尝试做的只是修复我正在尝试建立的简单客户端套接字连接的分段错误。我每次都在 connect() 行遇到分段错误,我不确定为什么。我已经尝试了多种不同的初始化所有连接的实现,但是没有运气绕过这个段错误。
这是Client.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 环境中,如果有帮助的话。
为什么这个奇怪的段错误来自 strchrnul?我无法从中找到任何信息。由于某些原因,我使用的是相当旧的 OS...是否有需要更新的包或其他东西,或者这与我的代码有关?
编辑: 这看起来像是 packages/something 和我的 OS 的问题。这似乎不是我的代码的问题。我只是 运行 这段代码 运行 它在我的 raspberry pi 运行 raspbian 上成功了。有人知道 CentOS 中的问题是什么吗?
您使用的 error()
不正确。根据手册页,该函数的格式为 void error(int status, int errnum, const char *format, ...);
,但您只是传递一个字符串。也许您打算使用 perror()
函数?
此外,如果不是复制错误,则您有一个无关的分号:
int main(int argc, char* argv[];) {
^