当我们需要在计算机程序中实现网络通信时,Socket 编程成为了一种非常重要的方式。C 语言是一种经典的编程语言,通过 C 语言实现 Socket 编程也是非常常见的。在接下来的讲解中,我们将会提供一个 C 语言中的 Socket 编程实例代码的完整攻略,并且会给出两条示例说明,让大家更好地理解代码的运用。
什么是 Socket 编程?
Socket 是一种通信机制,它位于传输层和应用层之间,用于实现网络协议族的通信,比如 TCP 和 UDP。Socket 编程利用 Socket 通信机制,在计算机程序之间实现数据的传输。
Socket 编程通常由客户端和服务端两个部分组成,客户端负责向服务端请求数据或服务,服务端则负责提供数据或服务。在 C 语言中,我们通过调用系统库函数实现 Socket 编程。
C 语言中的 Socket 编程实例代码
下面是一个简单的 C 语言中的 Socket 编程实例代码的模板。在这个示例代码中,我们通过一个简单的示例来说明如何使用 Socket 编程实现客户端向服务端发送一条消息的功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
int main() {
int client_sock;
struct sockaddr_in server_addr;
char buffer[1024] = {0};
if ((client_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr)<=0) {
printf("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
char *hello = "Hello from client";
send(client_sock, hello, strlen(hello), 0);
printf("Message sent\n");
return 0;
}
在上述示例代码中,我们可以看到 main 函数中分别完成了以下几个步骤:
- Socket 创建:通过调用系统库函数 socket() 创建一个 Socket。
- 设定服务器地址:使用结构体 server_addr 设置服务器的地址和端口号。
- 连接服务器:通过调用系统库函数 connect() 连接服务器。
- 发送消息:通过调用系统库函数 send() 发送消息。
在以上步骤中,我们也使用到了一些系统库函数,包括 socket()、inet_pton()、connect() 和 send() 函数。
示例说明1: Socket 服务端程序
下面是一个简单的 C 语言中的 Socket 服务端程序的示例代码。在这个示例代码中,我们通过使用 Socket 编程,实现了一个简单的 Echo 服务器,当客户端向服务器发送一条消息后,服务器会返回一条 Echo 回应消息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
int main() {
int server_fd, client_sock;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("Socket failed");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
if ((client_sock = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
int valread = read(client_sock, buffer, 1024);
printf("%s\n",buffer );
send(client_sock , buffer , strlen(buffer) , 0 );
printf("Echo message sent\n");
return 0;
}
在上述代码中,我们使用到了以下几个系统函数:socket()、bind()、listen()、accept() 和 read() 函数。在服务器程序中,我们设定了 Echo 协议,服务器会将客户端传来的消息原样返回。当客户端请求连接时,服务器调用 accept() 函数接收连接请求,并通过 read() 函数接收客户端传来的消息。接收到消息后,服务器通过 send() 函数将消息返回到客户端。
示例说明2: Socket UDP 通信
TCP 是一种面向连接的协议,它需要在连接建立后才能进行数据传输,而 UDP 是一种无连接的协议,可以直接向对方发送数据包。下面是一个简单的 C 语言中的 Socket UDP 通信的示例代码,它实现了客户端向服务端发送一个数据包的功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8080
int main() {
int sock;
struct sockaddr_in server_addr;
char buffer[1024] = {0};
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
printf("\n Socket creation error \n");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
char *hello = "Hello from client";
sendto(sock, (const char *)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *)&server_addr, sizeof(server_addr));
printf("Message sent\n");
close(sock);
return 0;
}
在 UDP 通信中,我们使用了 SOCK_DGRAM 类型的 Socket,它不需要调用 connect() 函数与对方建立连接,直接调用 sendto() 函数发送数据包即可。
结束语
以上就是关于 C 语言中的 Socket 编程实例代码的一个完整攻略,以及两条示例说明。Socket 编程是非常常见和重要的技能,希望大家通过本文能够更好地理解 Socket 编程的实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言中的socket编程实例代码 - Python技术站