c语言SOCKET编程指南(3)

2018-11-19 21:58

char *a1, *a2; . .

a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */ a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */ printf(\ printf(\ 输出如下:

address 1: 132.241.5.10 address 2: 132.241.5.10

假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符 指针。

上面就是关于这个主题的介绍。稍后,你将学习将一个类 似\的字符串转换成它所对应的IP地址(查阅域名服务,稍 后)。

-------------------------------------------------------------------------------- socket()函数

我想我不能再不提这个了-下面我将讨论一下socket()系统调用。 下面是详细介绍: #include #include

int socket(int domain, int type, int protocol);

但是它们的参数是什么? 首先,domain 应该设置成 \,就 象上面的数据结构struct sockaddr_in 中一样。然后,参数 type 告诉内核 是 SOCK_STREAM 类型还是

SOCK_DGRAM 类型。最后,把 protocol 设置为 \。(注意:有很多种 domain、type,我不可能一一列出了,请看 socket() 的 man帮助。当然,还有一个\更好\的方式去得到 protocol。同 时请查阅 getprotobyname() 的 man 帮助。)

socket() 只是返回你以后在系统调用种可能用到的 socket 描述符,或 者在错误的时候返回-1。全局变量 errno 中将储存返回的错误值。(请参考 perror() 的 man 帮助。) -------------------------------------------------------------------------------- bind()函数

一旦你有一个套接字,你可能要将套接字和机器上的一定的端口关联 起来。(如果你想用listen()来侦听一定端口的数据,这是必要一步--MUD 告 诉你说用命令 \x.y.z 6969\。)如果你只想用 connect(),那么这个步 骤没有必要。但是无论如何,请继续读下去。

这里是系统调用 bind() 的大概: #include #include

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

sockfd 是调用 socket 返回的文件描述符。my_addr 是指向数据结构 struct sockaddr 的指针,它保存你的地址(即端口和 IP 地址) 信息。 addrlen 设置为 sizeof(struct sockaddr)。

简单得很不是吗? 再看看例子: #include #include #include

#define MYPORT 3490 main() {

int sockfd;

struct sockaddr_in my_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0); /*需要错误检查 */ my_addr.sin_family = AF_INET; /* host byte order */

my_addr.sin_port = htons(MYPORT); /* short, network byte order */ my_addr.sin_addr.s_addr = inet_addr(\ bzero(&(my_addr.sin_zero),; /* zero the rest of the struct */ /* don't forget your error checking for bind(): */

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); . . .

这里也有要注意的几件事情。my_addr.sin_port 是网络字节顺序, my_addr.sin_addr.s_addr 也是的。另外要注意到的事情是因系统的不同, 包含的头文件也不尽相同,请查阅本地的 man 帮助文件。

在 bind() 主题中最后要说的话是,在处理自己的 IP 地址和/或端口的 时候,有些工作是可以自动处理的。

my_addr.sin_port = 0; /* 随机选择一个没有使用的端口 */

my_addr.sin_addr.s_addr = INADDR_ANY; /* 使用自己的IP地址 */

通过将0赋给 my_addr.sin_port,你告诉 bind() 自己选择合适的端 口。同样,将 my_addr.sin_addr.s_addr 设置为 INADDR_ANY,你告诉 它自动填上它所运行的机器的 IP 地址。

如果你一向小心谨慎,那么你可能注意到我没有将 INADDR_ANY 转 换为网络字节顺序!这是因为我知道内部的东西:INADDR_ANY 实际上就 是 0!即使你改变字节的顺序,0依然是0。但是完美主义者说应该处处一 致,INADDR_ANY或许是12呢?你的代码就不能工作了,那么就看下面 的代码:

my_addr.sin_port = htons(0); /* 随机选择一个没有使用的端口 */ my_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 使用自己的IP地址 */

你或许不相信,上面的代码将可以随便移植。我只是想指出,既然你 所遇到的程序不会都运行使用htonl的INADDR_ANY。

bind() 在错误的时候依然是返回-1,并且设置全局错误变量errno。

在你调用 bind() 的时候,你要小心的另一件事情是:不要采用小于 1024的端口号。所有小于1024的端口号都被系统保留!你可以选择从1024 到65535的端口(如果它们没有被别的程序使用的话)。

你要注意的另外一件小事是:有时候你根本不需要调用它。如果你使 用 connect() 来和远程机器进行通讯,你不需要关心你的本地端口号(就象 你在使用 telnet 的时候),你只要简单的调用 connect() 就可以了,它会检 查套接字是否绑定端口,如果没有,它会自己绑定一个没有使用的本地端口。

-------------------------------------------------------------------------------- connect()程序

现在我们假设你是个 telnet 程序。你的用户命令你得到套接字的文件 描述符。你听

从命令调用了socket()。下一步,你的用户告诉你通过端口 23(标准 telnet 端口)连接到\。你该怎么做呢? 幸运的是,你正在阅读 connect()--如何连接到远程主机这一章。你可 不想让你的用户失望。 connect() 系统调用是这样的: #include #include

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

sockfd 是系统调用 socket() 返回的套接字文件描述符。serv_addr 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr。addrlen 设置 为 sizeof(struct sockaddr)。 想知道得更多吗?让我们来看个例子: #include #include #include #define DEST_IP \ #define DEST_PORT 23 main() { int sockfd;

struct sockaddr_in dest_addr; /* 目的地址*/

sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 错误检查 */ dest_addr.sin_family = AF_INET; /* host byte order */

dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */


c语言SOCKET编程指南(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:天津依云郡一期地下室经济性分析-zjs120208

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: