如何掌握C语言网络核心编程的关键技巧?
- 行业动态
- 2025-01-28
- 7
网络核心编程涉及计算机网络通信的底层实现,包括IP地址、端口号、通信协议(如TCP/UDP)等要素,旨在实现数据在网络中的准确传输和交互。
C语言网络核心编程主要涉及套接字(Socket)编程,以下是详细介绍:
基础概念与准备工作
1、网络协议:网络编程基于网络协议,如TCP/IP协议族,TCP是面向连接、可靠的传输层协议,适用于文件传输、电子邮件等需要可靠传输的应用;UDP是无连接、不保证可靠性的传输层协议,具有较低的延迟和较高的传输效率,适用于视频会议、在线游戏等实时应用。
2、套接字的概念:套接字是网络编程的核心,是操作系统提供的一种网络通信接口,通过它程序可以在网络上发送和接收数据,套接字分为流套接字(用于TCP)和数据报套接字(用于UDP)。
套接字编程步骤
1、创建套接字:使用socket()函数创建套接字,该函数返回一个套接字描述符,如果失败则返回-1。int sockfd = socket(AF_INET, SOCK_STREAM, 0);。
2、绑定地址:对于服务器端程序,需要将套接字绑定到一个特定的IP地址和端口号,使用bind()函数实现。
struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(PORT); if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Bind failed"); exit(EXIT_FAILURE); }
3、监听和接受连接:服务器端需要监听端口,等待客户端连接,使用listen()和accept()函数。
if (listen(sockfd, 5) < 0) { perror("Listen failed"); exit(EXIT_FAILURE); } int connfd = accept(sockfd, (struct sockaddr *)&cli, &len); if (connfd < 0) { perror("Server accept failed"); exit(EXIT_FAILURE); }
4、发送和接收数据:无论是客户端还是服务器端,都需要发送和接收数据,使用send()和recv()函数。
char buff[MAX]; bzero(buff, sizeof(buff)); read(connfd, buff, sizeof(buff)); printf("From client: %s", buff); bzero(buff, sizeof(buff)); n = 0; while ((buff[n++] = getchar()) != 'n'); write(connfd, buff, sizeof(buff));
5、关闭套接字:当不再需要使用套接字时,应该及时关闭它,以释放资源,使用close()函数。close(connfd); close(sockfd);。
实际案例分析
1、TCP服务器与客户端:下面是一个简单的TCP服务器和客户端的例子。
TCP服务器:
#include <stdio.h> #include <netdb.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define MAX 80 #define PORT 8080 #define SA struct sockaddr void func(int sockfd) { char buff[MAX]; int n; for (;;) { bzero(buff, MAX); read(sockfd, buff, sizeof(buff)); printf("From client: %s", buff); bzero(buff, MAX); n = 0; while ((buff[n++] = getchar()) != 'n'); write(sockfd, buff, sizeof(buff)); } } int main() { int sockfd, connfd, len; struct sockaddr_in servaddr, cli; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { printf("socket creation failed...n"); exit(0); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) { printf("socket bind failed...n"); exit(0); } if ((listen(sockfd, 5)) != 0) { printf("Listen failed...n"); exit(0); } len = sizeof(cli); connfd = accept(sockfd, (SA*)&cli, &len); if (connfd < 0) { perror("Accept failed"); close(sockfd); exit(EXIT_FAILURE); } func(connfd); close(connfd); close(sockfd); }
TCP客户端:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define PORT 8080 int main() { int sock = 0; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char buffer[1024] = {0}; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf(" Socket creation error "); return -1; } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // Convert IPv4 and IPv6 addresses from text to binary form if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf(" Invalid address/ Address not supported "); return -1; } if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf(" Connection Failed "); return -1; } send(sock, hello, strlen(hello), 0); printf("Hello message sent "); int valread = read(sock, buffer, 1024); printf("%s ", buffer); close(sock); }
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/401625.html