首页 > 编程笔记
C语言socket网络编程
C语言是一门广泛应用于嵌入式系统、系统编程和网络编程等领域的编程语言。而 Socket 编程是一种常用的网络编程方式,它提供了一套网络通信接口,使得计算机程序可以通过网络进行通信。本文将为您介绍 C语言中的 Socket 网络编程,并为您提供一些简单易懂的示例代码。
下面是一个简单的服务器端代码示例:
接着,使用 bind() 函数将 Socket 与 IP 地址和端口号绑定。其中,INADDR_ANY 表示任何 IP 地址都可以与之通信,而 htons() 函数用于将主机字节序转换为网络字节序。
然后,使用 listen() 函数将 Socket 设置为监听状态,参数 5 表示可以同时连接的客户端数量上限为 5。
最后,使用 accept() 函数等待客户端的连接请求,并为其分配一个新的 Socket 描述符。当客户端连接成功后,我们向其发送了一条“Hello World!”的消息,并关闭了 Socket。
下面是一个简单的客户端代码示例:
接着,使用 connect() 函数向服务器端发起连接请求,并指定服务器端的IP地址和端口号。其中,inet_addr() 函数用于将字符串类型的 IP 地址转换为网络字节序的二进制值。
然后,使用 read() 函数接收服务器端发送的数据,并打印输出。最后,关闭 Socket。
Socket是什么?
Socket 是一种抽象的概念,它是一种网络通信机制的统称。在 Unix 操作系统中,Socket 被视为一种文件描述符,与普通文件操作的函数(如 open()、read() 和 write() 等)相似。Socket 通常用于基于 TCP/IP 协议栈的网络编程,它能够使得网络中的不同主机之间能够互相通信。建立Socket连接
在 Socket 编程中,需要建立连接来进行通信。建立连接的过程可以分为服务器端和客户端两个步骤。服务器端
服务器端的主要任务是监听网络端口,等待客户端的连接请求。当一个客户端请求连接时,服务器端将为其分配一个新的 Socket 描述符,然后利用这个 Socket 与客户端进行通信。下面是一个简单的服务器端代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int main(void) { // 创建Socket描述符 int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 将Socket与IP地址和端口号绑定 struct sockaddr_in serv_addr; 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(12345); bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 进入监听状态 listen(serv_sock, 5); // 接受客户端的连接请求 struct sockaddr_in clnt_addr; socklen_t clnt_addr_size = sizeof(clnt_addr); int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); // 向客户端发送数据 char str[] = "Hello World!"; write(clnt_sock, str, sizeof(str)); // 关闭Socket close(clnt_sock); close(serv_sock); return 0; }上述代码中,我们首先使用 socket() 函数创建了一个 Socket 描述符,指定了协议族为 AF_INET、传输协议为 SOCK_STREAM(即 TCP/IP 协议)和协议号为 IPPROTO_TCP。
接着,使用 bind() 函数将 Socket 与 IP 地址和端口号绑定。其中,INADDR_ANY 表示任何 IP 地址都可以与之通信,而 htons() 函数用于将主机字节序转换为网络字节序。
然后,使用 listen() 函数将 Socket 设置为监听状态,参数 5 表示可以同时连接的客户端数量上限为 5。
最后,使用 accept() 函数等待客户端的连接请求,并为其分配一个新的 Socket 描述符。当客户端连接成功后,我们向其发送了一条“Hello World!”的消息,并关闭了 Socket。
客户端
客户端的主要任务是向服务器端发起连接请求,并进行通信。客户端需要知道服务器端的 IP 地址和端口号才能与其建立连接。下面是一个简单的客户端代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int main(void) { // 创建Socket描述符 int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 向服务器端发起连接请求 struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(12345); connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); // 接收服务器端的数据 char buf[1024]; read(sock, buf, sizeof(buf) - 1); printf("Message from server: %s\n", buf); // 关闭Socket close(sock); return 0; }上述代码中,我们首先使用 socket() 函数创建了一个 Socket 描述符,同样指定了协议族为 AF_INET、传输协议为 SOCK_STREAM 和协议号为 IPPROTO_TCP。
接着,使用 connect() 函数向服务器端发起连接请求,并指定服务器端的IP地址和端口号。其中,inet_addr() 函数用于将字符串类型的 IP 地址转换为网络字节序的二进制值。
然后,使用 read() 函数接收服务器端发送的数据,并打印输出。最后,关闭 Socket。
Socket编程中常用的函数
下面是 Socket 编程中常用的一些函数:- socket():创建 Socket 描述符;
- bind():将 Socket 与 IP 地址和端口号绑定;
- listen():将 Socket 设置为监听状态;
- accept():等待客户端的连接请求,并为其分配一个新的 Socket 描述符;
- connect():向服务器端发起连接请求;
- read():接收数据;
- write():发送数据;
- close():关闭 Socket。