【发布时间】:2013-01-01 06:06:20
【问题描述】:
这是我第一次尝试编写网络程序。它编译没有问题,但是当我运行它时,它给了我一个“分段错误 11”。我希望有人能告诉我代码中可能导致此问题的原因。
我是 C 的新人。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
int main()
{
//////////// GETADDRINFO \\\\\\\\\\\\\\\\
struct addrinfo hints, *res;
memset(&hints, 0 , sizeof hints);
hints.ai_family = AF_UNSPEC; //define the 'hints' strucure
hints.ai_socktype = SOCK_STREAM; //define the 'hints' strucure
hints.ai_protocol = AI_PASSIVE; //define the 'hints' strucure
char *ipaddr = "127.0.0.1";
getaddrinfo(ipaddr, "ftp", &hints, &res);
////////////// SOCKET \\\\\\\\\\\\\\\\
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in info;
int bnd = bind( sock , res->ai_addr, res->ai_addrlen);
info.sin_family = AF_INET;
info.sin_port = htons(10000);
info.sin_addr.s_addr = INADDR_ANY;
bzero(&(info.sin_zero),8);
/////////////// CONNECT \\\\\\\\\\\\\\\\\\\\\\
int conct = connect( sock, res->ai_addr, res->ai_addrlen);
////////////// LISTEN \\\\\\\\\\\\\\\\\\
int lstn = listen( sock , 4 );
////////////// ACCEPT \\\\\\\\\\\\\\\\\\\\\\\
int new_fd;
struct sockaddr_storage client_addr;
socklen_t addr_size;
addr_size = sizeof(client_addr);
new_fd = accept(sock, (struct sockaddr *)&client_addr, &addr_size);
///////////////// SEND \\\\\\\\\\\\\\\\\\\\\\
char *msg = "HI!";
int len, bytes_sent;
len = strlen(msg);
bytes_sent = send(sock, msg, len, 0);
//////////////// RECEIVE \\\\\\\\\\\\\\\\\
char burr[254];
int cat = sizeof(burr);
recv( sock, burr , cat , 0 );
printf("%s", burr);
return 0;
}
【问题讨论】:
-
您需要找出失败的确切行,使用
printf等。这就是调试的工作原理。 -
您不是可能失败的错误检查函数,例如
getaddrinfo()或recv()。如果getaddrinfo()失败,则很容易导致分段错误。 -
@JonathanLeffler 是啊,我对懒惰感到内疚。我想快速写一些东西来测试一下。谢谢你的信息
-
问题是如果你跳过错误检查,你会得到崩溃。这实际上使该过程比首先编写错误检查要慢。确保你有一个好的错误报告库,以便于报告错误。
-
首先,检查是否发生分段错误,只需使用
gdb运行您的程序。
标签: c sockets networking segmentation-fault