您的位置:首页 > 理论基础 > 计算机网络

Linux网络编程初步认识

2014-08-13 10:18 176 查看
套接字:

程序访问网络进行数据通信的时候,TCP UDP,会遇到同时为多个应用程序并发进行通信的问题。多个TCP连接或者多个应用程序进程可能需要通过同一个TCP协议端口号传输数据,为了区别不同应用程序的进程和连接需要使用应用程序与TCP/IP协议交互的套接字的接口,是为了满足需要才出现的。

区分不同应用程序进程间的网络通信和连接,只要使用3个参数。

通信的目的ip地址,采用的传输协议,和端口号。

套接字相关类型:

struct sockaddr

{

unsigned short int sa_family;//通信协议类型,AF_INET表示TCP/IP

char sa_date[14];//保存ip地址和端口号

}

struct sockaddr_in

{

unsigned short int sin_family;//协议类型

uint16_t sin_port;//套结字使用端口号

struct in_adr sin_addr;//访问的ip地址

unsigned char sin_zero[8];//未使用的字段

}

套结字类型

流套接字(SOCK_STREAM)面向连接可靠,tcp

数据报套接字(Raw Socket)不面向连接 udp

原始套接字(SOCK_RAW);这个是没有经过处理的ip包,可以根据程序进行封装。

多用来编写其他协议。

域名取得ip地址 gethostbyname()

<netdb.h><sys/socket.h>

struct hostent *gethostbyname(const char *name);

返回的结构体

struct hostent

{

char *h_name;//正式主机名

char **h_aliases;//主机别名

char h_addrtype;

char h_length;地址长度

char **h_addr_list;//从域名服务器取得的主机地址

}

通过ip地址返回域名 gethostbyaddr()

<netdb.h><sys/socket.h>

struct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);

addr表示保存了ip地址的字符串

len表示ip地址长度

type一般 取AF_INET

由协议名称取得协议数据 getprotobyname()

struct protoent *getprotobyname(char *name);

name:表示一个协议名称的字符串。

返回的是一个protent的结构体指针。

struct protoent

{

char *p_name;//协议名称

char **p_aliases;//协议别称

int p_proto;//协议编号

}

由协议编号取得协议信息 getprotobynumber()

<netdb.h>

struct protoent *getprotobynumber(int proto);

取得系统支持的所有协议 getprotoent()

<netdb.h>

struct protoent * getprotoent(void);

每次调用返回系统支持的协议,系统支持的协议保存在/etc/protocols下面。

网络服务

网络上的计算机通过运行程序为其他的计算机提供信息或者运算的功能。例如:打开网页是访问了网站服务器上的服务,从服务器下载了网页文件。

取得系统支持的服务 getservent();

<netdb.h>

struct servent* getservent(void);

struct sevent

{

char *s_name;//服务名称

char **s_aliases;//服务可能的别的名称

char s_port;//服务可能的端口号,这个可能是建立在用到端口的基础上的

char *s_proto//服务使用协议

}

由名称取得系统支持的服务 getservbyname()

struct servent *getservbyname(char *name,char *proto);

name表示服务名称,比如ftp telnet,http

proto表示协议

由端口取得服务名称 getservbyport()

<netdb.h>

struct servent *getservbyport(int port,char *proto);

这个port要进行转换htons();

网络IP地址的转换

网络地址转换为长整形数:inet_addr()

long inet_addr(char *cp);

包含的文件

<stdio.h>

<sys/socket.h>

<arpa/inet.h>

<netinet/in.h>

cp是一个IP地址

长整形的IP地址转换为网络地址:inet_ntoa()

char *inet_ntoa*(struct in_addr in);

主机字符顺序与网络字符顺序的转换

计算机中的字符与网络里面的字符存储的顺序是不一样的,计算机的整形数据与网络的整形数据交换时候,需要用函数转换,如果计算机中的长整形IP转换为网络字符顺序的长整形IP地址,使用htonl()函数。

htonl()计算机32位长整形转换为网络字符顺序的32位长整形

htons()计算机16位长整形转换为网络字符顺序的16位长整形

ntohl()网络字符顺序32位长整形转换为计算机的32位长整形

ntohs()网络字符顺序16位长整形转换为计算机的16位长整形

错误处理 herror()

<netdb.h>

void h_error(const char *s);

s是一个字符串,调用这个函数的时候,会先输出这个字符串然后输出错误信息,、

错误信息是上一个与网络有关的函数发生的错误,使用比较随意。

捕捉错误编号:extern int h_errno;

捕捉到错误编号后可以用hsterror输出错误信息

<netdb.h>

char *hstrerror(int err);

错误号为0-5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: