socket() 只是返回你以后在系统调用种可能用到的 socket 描述符,或者在错误的时候
返回-1。全局变量 errno 中将储存返回的错误值。(请参考 perror() 的 man 帮助。)
11、bind()函数
一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联起来。(如果你想
用 listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 "telnet
x.y.z 6969"。)如果你只想用 connect(),那么这个步 骤没有必要。但是无论如何,
请继续读下去。
这里是系统调用 bind() 的大概:
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd 是 调 用 socket 返 回 的 文 件 描 述 符 。 my_addr 是 指 向 数 据 结 构 struct
sockaddr 的指针,它保存你的地址(即端口和 IP 地址) 信息。 addrlen 设置为
sizeof(struct sockaddr)。
简单得很不是吗? 再看看例子:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define _INT_PORT 3490
int main(void)
{
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(_INT_PORT);
my_addr.sin_addr.s_addr = inet_addr("132.241.5.10");
bzero(&(my_addr.sin_zero), sizeof(my_addr.sin_zero));
bind(sockfd, (struct sockaddr *)&my_addr,
sizeof(struct sockaddr));
}
这 里 也 有 要 注 意 的 几 件 事 情 。 my_addr.sin_port 是 网 络 字 节 顺 序 ,
my_addr.sin_addr.s_addr 也是的。另外要注意到的事情是因系统的不同, 包含的头
文件也不尽相同,请查阅本地的 man 帮助文件。
上面 bzero 是 Linux 上独有的,也在 string.h 下.等同于
memset(&(my_addr.sin_zero), 0, sizeof(my_addr.sin_zero));
在 bind() 主题中最后要说的话是,在处理自己的 IP 地址和/或端口的 时候,有些工作
是可以自动处理的。
my_addr.sin_port = 0;
my_addr.sin_addr.s_addr = INADDR_ANY;
通过将 0 赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端 口。同样,将