linux的socket

来源:互联网 发布:linux 虚拟终端 编辑:程序博客网 时间:2024/06/07 07:47

socket是做什么的:

虽然 socket 接口理论上还允许访问除 IP 以外的协议系列,然而在实际上,socket应用程序中使用的每个网络层都将使用 IP. 在传输层,socket 支持两个特殊协议:TCP (transmission control protocol,传输控制协议) 和 UDP (user datagram protocol,用户数据报协议)。

Socket不能用来访问较低(或较高)的网络层。例如,socket 应用程序不知道它是运行在以太网、令牌环网还是拨号连接上。Socket 的伪层(pseudo-layer)也不知道高层协议(比如 NFS、HTTP、FTP等)的任何情况(除非您自己编写一个 socket 应用程序来实现那些高层协议)。

在很多情况下,socket接口并不是用于网络编程 API 的最佳选择。特别地,由于存在很多很优秀的库可以直接使用高层协议,您不必关心 socket 的细节;那些库会为您处理 socket 的细节。例如,虽然编写您自己的 SSH 客户机并没有什么错,但是对于仅只是为了让应用程序安全地传输数据来说,就没有必要做得这样复杂。低级层比 socket 所访问的层更适合归入设备驱动程序编程领域。

TCP UDP

TCP 是流协议,而UDP是数据报协议。换句话说,TCP 在客户机和服务器之间建立持续的开放连接,在该连接的生命期内,字节可以通过该连接写出(并且保证顺序正确)。然而,通过 TCP 写出的字节没有内置的结构,所以需要高层协议在被传输的字节流内部分隔数据记录和字段

另一方面,UDP 不需要在客户机和服务器之间建立连接,它只是在地址之间传输报文。UDP 的一个很好特性在于它的包是自分隔的(self-delimiting),也就是一个数据报都准确地指出它的开始和结束位置。然而,UDP 的一个可能的缺点在于,它不保证包将会按顺序到达,甚至根本就不保证。当然,建立在 UDP 之上的高层协议可能会提供握手和确认功能。

主机名解析:

#include <stdio.h>          /* stderr, stdout */#include <netdb.h>          /* hostent struct, gethostbyname() */#include <arpa/inet.h>      /* inet_ntoa() to format IP address */#include <netinet/in.h>     /* in_addr structure */int main(int argc, char **argv) {struct hostent *host;     /* host information */        struct in_addr h_addr;    /* Internet address */         if (argc != 2) {              fprintf(stderr, "USAGE: nslookup <inet_address>\n");              exit(1);        }            if ((host = gethostbyname(argv[1])) == NULL){              fprintf(stderr, "(mini) nslookup failed on '%s'\n", argv[1]);              exit(1);        }        h_addr.s_addr = *((unsigned long *) host->h_addr_list[0]);        fprintf(stdout, "%s\n", inet_ntoa(h_addr));        exit(0);}
addia@addia-Lenovo-B470:~$ ./test   百度119.75.218.77



0 0
原创粉丝点击