`
yidongkaifa
  • 浏览: 4059794 次
文章分类
社区版块
存档分类
最新评论

linux网络编程学习

 
阅读更多

终于抽时间学习了linux的网络编程,以前只是对socket有个字面上的了解,具体的机制和用法一无所知。正好项目要用,学习下,做个笔记。

在linux上,任何都可以当做文件来对待。获得一个文件描述符,就可以对它进行读写操作。socket也是一样。

socket在linux下被翻译成套接字,我觉得这个翻译真的很烂,第一次接触的人不可能知道套接字是个什么东西。翻译成插座反而直观明了,更容易理解。

socket是为c/s模型设计的,也就是客户--服务器模型。解决了进程间通信的问题。

下面主要说的面向连接的socket,无连接的socket就不讲了。

简单的将,服务端起一个socket,监听一个端口,等待客户端的连接,然后客户端起一个socket,指向服务端的ip地址,端口号,向服务器发起连接请求。连接成功后就可以发送信息。看一下简单的流程


前面讲了socket可以当做一个文件来读写。那么读写文件一般都是要获得一个文件描述符,socket通信要获得一个socket描述符,也可以理解为特殊的文件描述符,叫法不同而已。

通过socket函数获得socket描述符

int socket(int domain , int type , int protocol);
这个函数返回一个int型的值,就是socket描述符。如果发生错误则返回-1。

domain确定通信域,包括地址格式。通常被设为AF_INET代表IPv4因特网。

type确定socket类型,是无连接还是有链接的。

protocol通常设为0,表示按给定的域和socket类型选择默认协议。比如domain为AF_INET,type为SCOK_STREAM时,默认协议就是TCP。

bind()函数绑定端口。声明如下

int bind (int sockfd , const struct sockaddr *my_addr , int addrlen) ;
其中,sockfd就是socket函数返回的socket描述符;my_addr是一个指向struck sockaddr的指针,包含地址信息:名称、端口和ip地址。

addrlen一般设为sizeof(struct sockaddr);

connect()函数连接服务器地址,声明如下:

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

返回一个int型的值,连接成功返回0,出错则返回-1;

参数sockfd还是socket描述符,此时是请求连接的socket。

serv_addr就是服务器地址。

listen函数

这个函数用来监听端口是否有请求,然后可以使用accept()来处理请求。声明:

int listen(int sockfd, int backlog);
sockfd跟前面一样,是socket描述符,backlog是未处理的请求队列可容纳最大数目。

accept()函数

int accept(int sockfd, void *addr, int *addrlen);
返回一个int值,这个int值是一个新的socket描述符,代表这个连接。此时有两个socket描述符,返回的这个就是和远程计算机的连接,而一开始的那个socket描述符仍然在指定的端口上进行监听。此时返回的这个socket描述符就可以进行读写了。

参数sockfd是在监听的socket描述符。

addr是一个struct sockaddr_in结构的指针,存储远程计算机的信息,如端口号和ip地址

发生错误返回-1.

面向连接的程序中,服务器执行如下函数:

调用socket()函数创建一个socket。

调用bind()函数把自己绑定在一个地址上。

调用listen()函数监听连接。

调用accept()函数处理请求。

调用send()和recv()来发送和接受消息

客户端执行下面的函数:

调用socket()函数创建一个socket。

调用connect()函数连接到服务器的网络地址上。

调用send()和recv()函数来发送和接收消息。

不传代码了,代码是改的别人的demo。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics