Linux下套接字编程
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类型(Type_STREAM指定,基 于TCP/IP实现,提供一个有序、可靠、双 向字节流的连接,发送的数据不会丢失、 乱序、重复。大的消息会被分块、传输、 重组,很像一个文件流。 数据报套接字:由SOCK_DGRAM指定,基 于UDP/IP协议,不建立和维持可靠连接, 开销小。
连接客户的地址将被放入address参数指向的 sockaddr结构中。 address_len指定客户结构的长度,如果客户地 址的长度超出这个值将被截断,所以必须先得到 这个合适的值。
请求连接
#include<sys/socket.h> int connect( int socket, struct sockaddr* address, size_t address_len);
struct sockaddr_in{ short int sin_family; unsigned short intsin_port; structin_addrsin_addr; }
四字节IP地址
创建套接字队列
#include <sys/socket.h> Int listen( int socket, int backlog);
套接字队列中,等待处理的进入连接的个数最 多不能超过backlog这个数字,多出的连接请求将 被拒绝,导致客户连接失败。 当服务器正忙于处理一个客户请求时,后续的 客户连接放入队列等待处理。函数执行成功返回0, 失败返回-1.
接受连接
#include <sys/socket.h> int accept( int socket, struct sockaddr* address, size_t* address_len);
Client.c
通过sockfd进行读写操作 write(sockfd,&ch,1); read(sockfd,&ch,1); printf(“char from server =%c\n”,ch); close(sockfd); exit(0); )
作业
实现教程上的代码实例。 创建server.c和client.c,客户端负责输入两 个操作数和一个操作符,服务器端负责接 收并根据操作符对两个操作数进行运算, 最后将操作结果返回给客户端。如客户端 输入2+4,服务器端将结果6返回给客户端。
返回套接字描述符 int socket( int domain, int type, int protocol); domain:域 type:指定套接字的通信类型 protocol:指定使用的协议
域(Domain)
指定套接字通信中使用的网络介质,包括地 址格式。最常用的有以下两种: AF_INET,即互联网络,基于IP协议,并且 每个服务对应一个端口号,套接字地址由 IP地址+端口号决定; AF_UNIX,基于本地机器,底层协议使用文 件输入/输出,地址为绝对路径的文件名。
Server.c
删除以前的套接字,为服务器创建一个未命名的套接字 unlink(“server_socket”); server_sockfd=socket(AF_UNIX,SOCK_STREAM,0); 命名套接字 server_address.sun_family = AF_UNIX; strcpy(server_address.sun_path,”server_socket”); server_len=sizeof(server_address); bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
Server.c
创建一个连接队列,开始等待客户进行连接
listen(server_sockfd,5); while(1){ char ch; printf(“server waiting\n”);
接受一个连接
client_len=sizeof(client_address); client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
其中,socket是套接字的标示符。address是 套接字地址。address_len是地址长度。
套接字地址
AF_UNIX:地址格式由sockaddr_un来描述
struct sockaddr_un{ sa_family_t sun_family char sun_path[]; }
AF_INET:地址格式由sockaddr_in来指定
微软的windows系统也通过可公开获取的 windows socket技术规范实现了套接字接口, 因此windows程序可以通过网络和 Linux/UNIX计算机进行通信,实现客户/服 务器系统,反之亦然。
创建套接字
#include <sys/types.h> #include<sys/socket.h>
Server.c
对客户进行读写操作 read(client_sockfd,&ch,1); ch++; write(client_sockfd,&ch,1); close(client_sockfd); } }
Client.c
头文件与变量声明 #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<sys/un.h> #include<unistd.h> #include<stdlib.h> int main() { int sockfd; int len; struct sockaddr_un address;
Linux套接字编程
套接字概念
套接字是一种进程间通信的方法,不同于以往 介绍的进程间通信方法的是,它并不局限于同 一台计算机的资源,除了可以在本地运行,还 可以在网络中运行。 套接字接口(socket interface)由伯克利版本 UNIX引入,可以认为是对管道概念的扩展— —一台机器上的进程可以使用套接字与另一台 机器上的进程通信。因此客户与服务器可以分 散到网络中。 同一台机器的进程间也可以用套接字通信。
参数socket指定的套接字将连接到参数 address指定的服务器套接字,address指向的结 构长度由参数address_len指定。
关闭套接字
可以通过close函数终止服务器和客户上的套 接字连接,操作过程与对文件描述符进行关闭一 样。
Server.c
头文件与变量声明
#include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<sys/un.h> #include<unistd.h> #include<stdlib.h> int main() { int server_sockfd,client_sockfd; int server_len,client_len; struct sockaddr_un server address; struct sockaddr_un client address;
协议(protocol)
我们重点讨论UNIX网络套接字和文件系统 套接字,不需要选择特定协议,只要默认 值(0)即可。
命名套接字
#include <sys/socket.h> int bind( int socket, const struct sockaddr* address, size_t address_len);
char ch=‘A’;
Client.c
为客户创建一个套接字 sockfd=socket(AF_UNIX,SOCK_STREAM,0); 根据服务器的情况对套接字命名 address.sun_family=AF_UNIX; strcpy(address.sun_puth,”server_socket”); len=sizeof(address); 将客户端套接字连接到服务器端套接字 connect(sockfd,(struct sockaddr*)&address,len);