c 网络编程教程
- 行业动态
- 2025-02-16
- 4433
网络编程教程主要教授如何使用编程语言进行网络通信和数据传输。
C语言网络编程是利用C语言进行网络应用程序开发的过程,它使得程序能够通过网络进行数据传输和通信,以下是关于C语言网络编程的详细教程:
1、基础概念与准备工作
网络编程基础知识:网络编程是通过网络进行数据传输的技术,最常用的协议是TCP/IP协议,TCP是面向连接的、可靠的传输协议;UDP是无连接的、不保证可靠性的传输协议。
套接字的概念:套接字(Socket)是网络编程的核心,它是操作系统提供的一种网络通信接口,通过它,程序可以在网络上发送和接收数据,套接字可以分为流套接字(用于TCP)和数据报套接字(用于UDP)。
2、套接字编程步骤
创建套接字:在C语言中,使用socket()
函数来创建套接字,该函数返回一个套接字描述符,如果失败则返回-1。
int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket creation failed"); exit(EXIT_FAILURE); }
绑定套接字:对于服务器端程序,需要将套接字绑定到一个特定的IP地址和端口号,使用bind()
函数来实现。
struct sockaddr_in servaddr; servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = INADDR_ANY; servaddr.sin_port = htons(PORT); if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { perror("socket bind failed"); exit(EXIT_FAILURE); }
监听和接受连接:服务器端需要监听端口,等待客户端连接,使用listen()
和accept()
函数来实现。
if (listen(sockfd, 5) != 0) { perror("Listen failed"); exit(EXIT_FAILURE); } int connfd; connfd = accept(sockfd, (struct sockaddr *)&cli, &len); if (connfd < 0) { perror("server accept failed"); exit(EXIT_FAILURE); }
发送和接收数据:无论是客户端还是服务器端,都需要发送和接收数据,使用send()
和recv()
函数来实现。
char buff[MAX]; int n; 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));
3、TCP和UDP的区别与选择
TCP协议:TCP是面向连接的协议,提供可靠的、双向的字节流传输,它保证数据按顺序到达,并且没有数据丢失,适用于需要可靠传输的应用,例如文件传输、电子邮件等。
UDP协议:UDP是无连接的协议,不保证数据按顺序到达,也不保证数据不丢失,它具有较小的传输开销和较高的传输速度,适用于实时应用,例如视频会议、在线游戏等。
4、实际案例分析
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客户端:下面是一个简单的TCP客户端的例子,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 *message = "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); 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, message, strlen(message), 0); printf("Hello message sent "); read(sock, buffer, 1024); printf("%s ", buffer); return 0; }
本站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本站,有问题联系侵删!
本文链接:http://www.xixizhuji.com/fuzhu/28574.html