Linux网络编程培训哪个好

Linux网络编程培训哪个好
Linux网络编程培训哪个好

Linux网络编程培训哪个好

Linux下的网络编程培训哪个好?先来了解一下什么事Linux下的网络编程吧!

Linux下的网络编程指的是socket套接字编程,入门比较简单。在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾。总感觉每次看的时候都有收获,但是每次看完了之后,过段时间不看,重新拾起这些知识的时候又要从头开始,所以,在这里做个笔记也算是做个模板,以后可以直接从某一个阶段开始接着玩……

socket套接字基本函数介绍

1 创建socket套接字

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

功能介绍:

在Linux操作系统中,一切皆文件,这个大家都知道,个人理解创建socket 的过程其实就是一个获得文件描述符的过程,当然这个过程会是比较复杂的。可以从内核中找到创建socket的代码,并且socket的创建和其他的listen,bind 等操作分离开来。socket函数完成正确的操作是返回值大于0的文件描述符,当返回小于0的值时,操作错误。同样是返回一个文件描述符,但是会因为三个参数组合不同,对于数据具体的工作流程不同,对于应用层编程来说,这些也是不可见的。

参数说明:

从socket创建的函数可以看出,socket有三个参数,family代表一个协

议族,比较熟知的就是AF_INET,PF_PACKET等;第二个参数是协议类型,常见类型是SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_PACKET等;第三个参数是具体的协议,对于标准套接字来说,其值是0,对于原始套接字来说就是具体的协议值。

2 地址端口绑定函数bind

int bind(intsockfd, conststructsockaddr *myaddr, socklen_taddrlen); 功能介绍:

bind函数主要应用于服务器模式一端,其主要的功能是将addrlen长度structsockaddr类型的myaddr地址与sockfd文件描述符绑定到一起,在sockaddr中主要包含服务器端的协议族类型,网络地址和端口号等。在客户端模式中不需要使用bind函数。当bind函数返回0时,为正确绑定,返回-1,则为绑定失败。

参数说明:

bind函数的第一个参数sockfd是在创建socket套接字时返回的文件描述符。

bind函数的第二个参数是structsockaddr类型的数据结构,由于structsockaddr数据结构类型不方便设置,所以通常会通过对tructsockaddr_in进行地质结构设置,然后进行强制类型转换成structsockaddr类型的数据,下面是两种类型数据结构的定义和对应关系图。

typedef unsigned short sa_family_t;

structin_addr {

__be32 s_addr;

};

structsockaddr {

sa_family_tsa_family; /* address family, AF_xxx */

charsa_data[14]; /* 14 bytes of protocol address */

};

/* Structure describing an Internet (IP) socket address. */

#define __SOCK_SIZE__ 16 /* sizeof(structsockaddr) */ structsockaddr_in {

sa_family_tsin_family; /* Address family */

__be16 sin_port; /* Port number */

structin_addrsin_addr; /* Internet address */

/* Pad to size of `structsockaddr'. */

unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -

sizeof(unsigned short int) - sizeof(structin_addr)];

};

图5 structsockaddr_in和structsockaddr的映射关系

bind函数的第三个参数是指定structsockaddr类型数据的长度,因为前面讲过bind函数的第二个参数是通过设置一个较容易的数据结构,然后通过强制类型转换成structsockaddr,实际上,第二个参数具体的数据结构的长度会根据socket创建时,设置的family协议族的不同而不同,像AF_UNIX协议族的bind函数第二个参数的数据结构应该是structsockaddr_un,其大小和structsockaddr_in不同。

3 监听本地端口listen

int listen(intsockfd, int backlog);

功能介绍:

刚开始理解listen函数会有一个误区,就是认为其操作是在等在一个新的connect的到来,其实不是这样的,真正等待connect的是accept操作,listen 的操作就是当有较多的client发起connect时,server端不能及时的处理已经建立的连接,这时就会将connect连接放在等待队列中缓存起来。这个等待队列的长度有listen中的backlog参数来设定。listen和accept函数是服务器模

式特有的函数,客户端不需要这个函数。当listen运行成功时,返回0;运行失败时,返回值位-1.

参数说明:

sockfd是前面socket创建的文件描述符;backlog是指server端可以缓存连接的最大个数,也就是等待队列的长度。

4 接受网络请求函数accept

int accept(intsockfd, structsockaddr *client_addr, socklen_t *len);

功能介绍:

接受函数accept其实并不是真正的接受,而是客户端向服务器端监听端口发起的连接。对于TCP来说,accept从阻塞状态返回的时候,已经完成了三次握手的操作。Accept其实是取了一个已经处于connected状态的连接,然后把对方的协议族,网络地址以及端口都存在了client_addr中,返回一个用于操作的新的文件描述符,该文件描述符表示客户端与服务器端的连接,通过对该文件描述符操作,可以向client端发送和接收数据。同时之前socket创建的sockfd,则继续监听有没有新的连接到达本地端口。返回大于0的文件描述符则表示accept成功,否则失败。

参数说明:

sockfd是socket创建的文件描述符;client_addr是本地服务器端的一个structsockaddr类型的变量,用于存放新连接的协议族,网络地址以及端口号等;第三个参数len是第二个参数所指内容的长度,对于TCP来说其值可以用sizeof(structsockaddr_in)来计算大小,说要说明的是accept的第三个参数要是指针的形式,因为这个值是要传给协议栈使用的。

5 连接目标服务器函数connect

int connect(intsock_fd, structsockaddr *serv_addr,intaddrlen);

功能介绍:

连接函数connect是属于client端的操作函数,其目的是向服务器端发送连接请求,这也是从客户端发起TCP三次握手请求的开始,服务器端的协议族,网络地址以及端口都会填充到connect函数的serv_addr地址当中。当connect 返回0时说明已经connect成功,返回值是-1时,表示connect失败。

参数说明:

connect的第一个参数是socket创建的文件描述符;第二个参数是一个structsockaddr类型的指针,这个参数中设置的是要连接的目标服务器的协议族,网络地址以及端口号;第三个参数表示第二个参数内容的大小,与accept 不同,这个值不是一个指针。

在服务器端和客户端建立连接之后是进行数据间的发送和接收,主要使用的接收函数是recv和read,发送函数是send和write。因为对于socket套接字来说,最终实际操作的是文件描述符,所以可以使用对文件进行操作的接收和发送函数对socket套接字进行操作。对于UDP编程来说,其服务器端和客户端之间没有三次握手建立连接,所以服务器端没有listen和accept函数,客户端没有connect函数。所以对于服务器端来说,没有accept函数,所以使用recvfrom函数来获取数据的同时获得客户端的协议族,网络地址以及端口号;对于客户端来说,没有connect函数,所以使用sendto函数发送数据的同时设置服务器端的协议族,网络地址以及端口;同理如果recvfrom用在客户端,则

是接收服务器端数据和地址,sendto用在服务器端,则是发送到客户端网络地址以及端口数据。

6 接收数据函数recvfrom

ssize_trecvfrom(intsockfd, void *buf, size_tlen, int flags, structsockaddr *from, socklen_t *fromlen);

功能介绍:

对于该函数主要的功能是,从客户端或者服务器端接收数据以及发送方的地址信息存储到本地的structsockaddr类型参数变量当中,如果函数返回-1,所说明接收数据失败,如果返回的是大于等于0的值,则说明函数接收到的数据的大小。因为可以设置文件描述符的状态为阻塞模式,所以在没有接收到数据时,recvfrom会一直处于阻塞状态,直到有数据接收到。

参数说明:

sockfd是创建socket时的文件描述符;buf用于存储接收到的数据缓冲区,接收的数据将放到这个指针所指向的内容的空间中;len是接收缓冲区的大小;from是指向structsockaddr的指针,接收发送方地址信息;fromlen是表示第5个参数所指向内容的长度,可以使用sizeof(structsockaddr)来定义大小,不过因为是要传给内核协议栈,所以使用了指针类型。

7 发送数据函数sendto

sizeof_tsendto(intsockfd, const void *buf, size_tlen, int flag, conststructsockaddr *to, socklen_ttolen);

功能介绍:

sendto函数主要根据填充的接收方的地址信息向客户端或者服务器端发

送数据,接收方的地址信息会提前设置在structsockaddr类型的参数指针中,当返回值-1时,表明发送失败,当返回值大于等于0时,表示发送成功,并且发送数据的大小会通过返回值传递回来。

参数说明:

sockfd是有socket创建的文件描述符;buf是发送数据缓冲区,要发送的数据会放在这个指针指向的内容空间中;len是发送缓冲区的大小;to是一个structsockaddr类型的指针,其指向地址的内容是接收方地址信息;tolen表示第5个参数指向的数据内容的长度,传递的是值,可以用sizeof(structsockaddr)计算。

以上就是千锋Linux学院的学习笔记。

另附心得体会一篇:

从零基础开始学Linux或者是转行学习Linux,参加培训会保证你在单位时间内学到更多,毕竟随着Linux行业的快速发展,未来必将会面临更多的竞争,所以只有不遗余力的把自己打造成一把利剑,从专业度到职业素质,只有比别人更突出和优秀,才能够在这个相互选择的世界当中拥有更多的选择权利。现在想要学习Linux技术,只有通过参加培训才可以保证快速掌握所学知识和技能,所以培训是比较靠谱的。

Linux下的网络编程培训哪个好?千锋教育的Linux课程专注于当前热门的Linux相关技术,就Linux而言,内容全面而细致的。Linux教学团队由众多名师打造,拥有多年教学经验和高超的Linux授课技巧和实战视野,让你理论和实战兼得。

相关主题
相关文档
最新文档