Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用套接字导致分段错误的Uknown原因_C_Sockets_Segmentation Fault - Fatal编程技术网

在C中使用套接字导致分段错误的Uknown原因

在C中使用套接字导致分段错误的Uknown原因,c,sockets,segmentation-fault,C,Sockets,Segmentation Fault,这是C语言中通过套接字进行通信的服务器端代码。我遇到了一个分段错误,但我能理解它发生的原因。代码如下: int server_sd ; // The socket descriptor server_sd = socket(PF_INET, SOCK_STREAM, 0); if (server_sd == -1) { cout << "Could not create socket"; } else { cout << "Socket created

这是C语言中通过套接字进行通信的服务器端代码。我遇到了一个分段错误,但我能理解它发生的原因。代码如下:

int server_sd ; // The socket descriptor

server_sd = socket(PF_INET, SOCK_STREAM, 0);

if (server_sd == -1) {
    cout << "Could not create socket";
} else {
    cout << "Socket created" << endl;
}

struct protoent *proto;
proto = getprotobyname("http");

struct sockaddr_in addr;
cout << "sockaddr is created" << endl;

memset((void *)&addr, 0, sizeof(addr));
cout << "memset is done";

addr.sin_family = AF_INET;
addr.sin_port = proto->p_proto;
addr.sin_addr.s_addr = INADDR_ANY; /* any interface */

cout << "Binding server now:" << endl;

if( bind(server_sd,(sockaddr *)&addr , sizeof(addr)) < 0) {
    //print the error message
    perror("bind failed. Error");
} else {
    cout << "bind done" << endl;
}

listen(server_sd, 10); /* make into listener with 10 slots */

cout << "Waiting for incoming connections..." << endl;

你可能会在这里崩溃:

addr.sin_port = proto->p_proto;
proto
可能为空


您没有看到
memset已完成
打印的原因是您没有任何
,调试器将能够更具体地告诉您错误发生的位置。您是否检查了
getprotobyname
的返回值?在取消引用之前检查
proto
的值。
cout调试器绝对是您想要的!!话虽如此,
cout
将不会刷新,除非您手动刷新它或执行
endl
。您的“memset is done”没有。在gdb中运行并查看堆栈跟踪您是否可以使用gdb或其他调试器查看传入memset的确切值?我看不出有什么不对。。。尝试将memset移动到第一行,它是否仍然崩溃?同意——至少在我的系统上的/etc/protocols中没有“http”协议。
addr.sin_port = proto->p_proto;