sockaddr_in在此计划中的目的是什么?

时间:2013-09-24 00:33:56

标签: c sockets client-server

对于我的一个类,我必须编写一个服务器和一个客户端,我们得到了一些示例代码。这是我感到困惑的片段:

main()
{
int      sock, sock_current, cc, fromlen, tolen; /*sd is the socket */
int      addrlen;
struct   sockaddr_in sin;
struct   sockaddr_in pin;

/* get an internet domain socket */
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
}

/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(PORT);

/* bind the socket to the port number */
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
    perror("bind");
    exit(1);
}

我认为sockaddr_in struct sin的目的是存储一个本地IP地址,以便在绑定时与sock关联。我是否正确?如果我是正确的,那么这段代码如何实现呢?我不明白:

/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(PORT);

2 个答案:

答案 0 :(得分:2)

bind函数为套接字分配本地协议地址。这里sin的目的是告诉bind要分配的本地地址。

memset(&sin, 0, sizeof(sin));     
sin.sin_family = AF_INET;          //it's an IPv4 address
sin.sin_addr.s_addr = INADDR_ANY;  //wildcard IP address
sin.sin_port = htons(PORT);        //bind to this port number

答案 1 :(得分:0)

除了Yu所说的(这一切都是正确的)之外,如果你在调用listen()之前没有调用bind(可能就在你发布的代码片段之后),它会在随机的TCP端口上监听(因为您在调用socket()时打开了一个IPv4 TCP套接字)。

这有时候非常有用 - 我有一个应用程序可以通过LAN广播它运行的端口供客户端查找,所以无论它在哪个端口都无关紧要。

此外,您可以在调用connect()之前绑定,如果需要,可以强制在哪个端口或接口上进行传出连接,但这也不常见。