Linux网络编程初步认识

本文详细解析了网络通信中TCP和UDP协议如何通过套接字接口实现多应用并发通信,介绍了套接字相关类型、套接字类型(如流套接字、数据报套接字和原始套接字),以及获取网络服务、IP地址和协议的方法。同时,阐述了网络地址转换、主机字符与网络字符顺序转换及错误处理的相关技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

套接字:
程序访问网络进行数据通信的时候,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 telnethttp
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值