当前位置:首页 > 编程资讯 > 正文内容

从零开始:深入浅出Socket编程入门与实践

admin1周前 (07-03)编程资讯5

从零开始:深入浅出Socket编程入门与实践

一、什么是Socket?

在互联网的世界里,数据传输是必不可少的。而Socket,就是数据传输的桥梁。简单来说,Socket是一种通信协议,它定义了网络中两个程序之间进行通信的规则和约定。通过Socket,我们可以实现不同计算机之间的数据交换。

二、Socket编程基础

1. Socket类型

Socket分为两种类型:流式Socket(Stream Socket)和数据报Socket(Datagram Socket)。

(1)流式Socket:提供面向连接的服务,确保数据传输的可靠性和顺序性。TCP协议使用的就是流式Socket。

(2)数据报Socket:提供无连接的服务,数据传输不可靠,无顺序性。UDP协议使用的就是数据报Socket。

2. Socket编程模型

Socket编程模型主要包括以下几个步骤:

(1)创建Socket:使用socket()函数创建一个Socket。

(2)绑定地址:使用bind()函数将Socket绑定到指定的IP地址和端口号。

(3)监听连接:使用listen()函数使Socket处于监听状态,等待客户端的连接请求。

(4)接受连接:使用accept()函数接受客户端的连接请求,创建一个新的Socket。

(5)数据传输:使用send()和recv()函数进行数据的发送和接收。

(6)关闭连接:使用close()函数关闭Socket连接。

三、Socket编程实践

下面以TCP协议为例,介绍Socket编程的实践过程。

1. 创建服务器端Socket

```c

#include

#include

#include

#include

#include

#include

int main() {

int server_fd, new_socket;

struct sockaddr_in address;

int opt = 1;

int addrlen = sizeof(address);

// 创建socket文件描述符

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {

perror("socket failed");

exit(EXIT_FAILURE);

}

// 强制绑定到IPv4

if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {

perror("setsockopt");

exit(EXIT_FAILURE);

}

address.sin_family = AF_INET;

address.sin_addr.s_addr = INADDR_ANY;

address.sin_port = htons(8080);

// 绑定socket到指定地址和端口

if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {

perror("bind failed");

exit(EXIT_FAILURE);

}

// 监听socket

if (listen(server_fd, 3) < 0) {

perror("listen");

exit(EXIT_FAILURE);

}

// 接受客户端连接

if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {

perror("accept");

exit(EXIT_FAILURE);

}

// 关闭服务器端socket

close(server_fd);

return 0;

}

```

2. 创建客户端Socket

```c

#include

#include

#include

#include

#include

#include

int main() {

int sock;

struct sockaddr_in serv_addr;

// 创建socket文件描述符

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {

printf("\n Socket creation error \n");

return -1;

}

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(8080);

// 将IP地址转换为二进制形式

if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {

printf("\nInvalid address/ Address not supported \n");

return -1;

}

// 连接到服务器

if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {

printf("\nConnection Failed \n");

return -1;

}

// 发送数据

char *hello = "Hello from client";

send(sock , hello , strlen(hello) , 0 );

// 接收数据

char buffer[1024] = {0};

read( sock , buffer, 1024);

printf("Server : %s\n",buffer );

// 关闭socket

close(sock);

return 0;

}

```

四、总结

Socket编程是实现网络通信的重要手段。本文从Socket的基本概念、编程模型以及实践过程进行了详细介绍。通过本文的学习,相信读者对Socket编程有了更深入的了解。在实际开发过程中,Socket编程可以帮助我们实现丰富的网络应用,如文件传输、视频通话等。

相关文章

图数据库:未来数据存储的利器,企业如何把握先机?

图数据库:未来数据存储的利器,企业如何把握先机?

随着互联网的快速发展,数据已经成为企业最宝贵的资产之一。然而,传统的数据库在处理复杂关系和大规模数据时,往往显得力不从心。这时,图数据库应运而生,成为未来数据存储的利器。本文将深入分析图数据库的优势...

科学计算:揭秘编程领域的“数字魔法师”

科学计算:揭秘编程领域的“数字魔法师”

一、引言 随着科技的飞速发展,编程已经渗透到了我们生活的方方面面。而在这片数字海洋中,有一项技术尤为引人注目,那就是科学计算。它不仅推动了科研领域的进步,也为各行各业的发展提供了强大的技术支持。本文...

Notion:重塑知识管理,编程行业的未来助手

Notion:重塑知识管理,编程行业的未来助手

在信息爆炸的时代,如何高效地管理和利用知识成为了一个亟待解决的问题。对于编程行业来说,知识管理更是至关重要。而Notion,这款新兴的知识管理工具,正以其独特的魅力,重塑着编程行业的知识管理方式。...

从入门到精通:深度解析编程领域的负载均衡策略

从入门到精通:深度解析编程领域的负载均衡策略

一、 引言 随着互联网的快速发展,网站和应用的数量日益增加,随之而来的高并发访问和数据量增长给服务器带来了巨大的压力。如何有效地处理这些请求,确保系统稳定运行,成为了软件开发者和运维人员面临的重要课...

编程比赛:一场技术与智慧的较量,我的参赛心得与感悟

编程比赛:一场技术与智慧的较量,我的参赛心得与感悟

在编程这个行业,每个人都是追求卓越的战士,而编程比赛,则是一场技术与智慧的较量。自从接触到编程,我就一直对编程比赛充满了向往。今天,就让我来和大家分享一下我在编程比赛中的心得与感悟。 一、参赛前的准...

《IntelliJ IDEA:深入浅出,揭开这款编程利器的神秘面纱》

《IntelliJ IDEA:深入浅出,揭开这款编程利器的神秘面纱》

在当今编程领域,IDE(集成开发环境)作为程序员们得力的助手,已经成为提升开发效率的关键工具。而在众多IDE中,IntelliJ IDEA以其卓越的性能、丰富的插件生态系统以及高度智能化的人工智能功...