在C中使用套接字导致分段错误的Uknown原因
这是C语言中通过套接字进行通信的服务器端代码。我遇到了一个分段错误,但我能理解它发生的原因。代码如下:在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
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;