Linux是现代操作系统中最受欢迎的之一,它可以运行在各种不同的机器上。其中一个主要的原因是因为它的开放性质,它的许多部分都是开源的,这使得开发人员能够快速地开发出自己的程序和工具来运行在Linux上。
而“Socket编程”可以说是Linux程序员必须掌握的一项技能,它是网络编程中最基础和最常用的模型。本文将围绕“Linux下Socket编程”这一主题,深入了解从基础到实践。
一、Socket是什么?
Socket,中文意思为“插座”,它是网络编程中的一个重要概念。我们可以把Socket理解为是传输数据的一个“轮子”,在客户端和服务器之间建立一种“通信机制”,使它们能够在网络中互相传递数据。
二、Socket编程的基础知识
1、Socket编程的分类
Socket编程主要分为IPv4和IPv6两种,IPv4应用更为广泛。大部分常见的网络应用都使用TCP或UDP协议,因此,Socket编程也分为TCP和UDP两种。
2、TCP和UDP的区别
TCP是传输控制协议,它提供面向连接的可靠数据流传输服务。相对应的,UDP是用户数据报协议,它提供无连接的数据包传输服务。TCP会提供如下特性:数据传输的可靠性、流控制、拥塞控制。而UDP不会提供如上特性,但是它的开销更小。
三、Socket实践
本小节将介绍Socket编程的实践,通过一组简单的代码,演示如何通过Socket建立一个服务器,接收客户端的请求并向客户端发送一个确认信息。
1、服务端代码
```
//引用头文件
#include
#include
#include
#include
#include
#include
#include
int main(void) {
int serv_sock, conn_sock;
struct sockaddr_in serv_addr, cli_addr;
socklen_t cli_addr_len;
//创建一个socket
serv_sock = socket(AF_INET, SOCK_STREAM, 0);
//设置socket的IP和端口号
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(1024);
//Bind
if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
exit(1);
}
//Listen
if(listen(serv_sock, 5) == -1) {
perror("listen");
exit(1);
}
while(1) {
//Accept
cli_addr_len = sizeof(cli_addr);
conn_sock = accept(serv_sock, (struct sockaddr*)&cli_addr, &cli_addr_len);
//Send
char msg[100] = "Welcome to our website!";
send(conn_sock, msg, sizeof(msg), 0);
//Close
close(conn_sock);
}
return 0;
}
```
上述代码的主要作用是创建一个socket,并在IP和端口号上绑定一个地址,并设置该socket为监听模式,等待客户端的请求。一旦有请求进来,向客户端发送一条“欢迎信息”后关闭连接。
2、客户端代码
```
//引用头文件
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char** argv) {
//检查命令行参数
if (argc != 2) {
printf("Usage: %s
exit(1);
}
int cli_sock;
struct sockaddr_in serv_addr;
//创建一个socket
cli_sock = socket(AF_INET, SOCK_STREAM, 0);
//设置socket的IP地址和端口号
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(1024);
//Connect
if(connect(cli_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
exit(1);
}
//Recv
char recv_msg[100];
ssize_t recv_len = recv(cli_sock, recv_msg, sizeof(recv_msg), 0);
recv_msg[recv_len] = '\0';
printf("%s\n", recv_msg);
//Close
close(cli_sock);
return 0;
}
```
客户端代码则主要向服务端发起连接,接收服务端返回的欢迎消息并输出。
四、小结
Socket编程在Linux下是非常基础和重要的一种编程方式。本文介绍了Socket编程的基础知识以及实践。Socket编程已经成为了Linux程序员必须掌握的一项技能,笔者也欢迎读者在自己的开发中深入学习和了解相关内容。