sockaddr_in导致段错误?

时间:2011-01-11 19:49:07

标签: c sockets include

现在正在C中创建一个服务器/客户端系统,我在客户端部分遇到了一些麻烦。从我所看到的,我需要使用sockaddr_in,以便我可以连接到服务器。但是,我每次都得到一个段错误。我相信sockaddr_in与它有关,就像评论它一样,它在程序后面的引用修复了段错误。

代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>

int main(int argc, char** argv)
{
int Csock;
int con;
char *data = 0;
char buf[101] = "";
struct sockaddr_in addr;

Csock = socket(AF_INET, SOCK_STREAM, 0);

addr.sin_family = AF_INET;
addr.sin_port = htons(3435);

con = connect(Csock, (struct sockaddr*) &addr, sizeof(addr));

write(con, "Text", sizeof("Text"));
*data = read(con, buf, 100);
puts(data);
return 0;
}
可悲的是,我对C很陌生,所以这就像我能想到的那样......谁能告诉我一个消除段错的方法呢?

谢谢!

3 个答案:

答案 0 :(得分:6)

快速评论:

data是指向char的指针,它不指向已分配的内存,因此:

*data = read(con, buf, 100);

无效!您不能取消引用NULL指针。

此外,read返回ssize_t,而不是char,所以也许:

ssize_t nread = read(con, buf, 100);

然后使用printf打印出nread。

答案 1 :(得分:2)

当你的意思是sizeof &addr时,有一个明显的错误就是sizeof addr。您也从未设置要连接的地址,只设置端口。在大多数系统中,这些错误都不会导致崩溃,但它们会阻止程序运行。

同样建议不要直接设置sockaddr结构,而是使用getaddrinfo

答案 2 :(得分:0)

我认为问题在于你的连接语句。你需要

con = connect(Csock, (struct sockaddr*) &addr, sizeof(addr));

sizeof()返回对象的大小。我不会随意知道addr结构的大小是什么,但语句sizeof(&amp; addr)将返回4(假设32位系统)并且我非常确定addr结构的大小是&gt; 4个字节。

&amp;是引用运算符(或地址),并为您提供特定结构的地址。地址(在32位系统中)是4个字节。通常,函数类型(如connect函数)需要结构的实际大小。这通常是出于向后兼容的目的而进行的,因此,如果结构的大小在SDK或库的某个未来版本中发生更改,则较旧的代码无需更改即可使用较新的库。