31 C语言进阶到上手大纲

31 C语言进阶到上手大纲

小节:网络编程基础概念

1. 网络编程概述

  • 网络编程是指在计算机网络上进行通信的编程技术,其目的是实现不同计算机间的数据传输。
  • 主要采用TCP/IP协议族进行通信。

2. 网络模型

  • 分层模型:网络编程常用的分层模型包括OSI七层模型和TCP/IP四层模型。
  • TCP/IP模型
    • 应用层:处理应用程序的通信。
    • 传输层:负责数据的传输,常用协议有TCPUDP
    • 网络层:负责数据包的路由,常用协议有IP
    • 链路层:负责物理地址的传输。

3. 常用协议

  • TCP(传输控制协议)

    • 面向连接,可靠性高,通过三次握手建立连接。
    • 示例用法:适用于需要保证数据完整性的应用,如HTTP、FTP等。
  • UDP(用户数据报协议)

    • 无连接,轻量级,适用于实时应用。
    • 示例用法:适用于音视频传输、DNS等。

4. 套接字编程基础

  • 套接字(Socket):是网络通信的基本操作单元,提供了网络通信的接口。
  • 基本概念
    • server socketclient socket
    • IP地址端口号的组合用以唯一标识一个套接字。

4.1 创建套接字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}
// 继续进行...
return 0;
}

4.2 绑定套接字

  • 将套接字与本地地址(IP + 端口)绑定。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET; // IP地址类型
    serv_addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有接口
    serv_addr.sin_port = htons(12345); // 指定端口号

    if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
    perror("ERROR on binding");
    exit(1);
    }

4.3 监听和接受连接

  • 在服务端,使用listenaccept处理来自客户端的请求。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    listen(sockfd, 5); // 会话队列最多5个

    int newsockfd;
    struct sockaddr_in cli_addr;
    socklen_t clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
    if (newsockfd < 0) {
    perror("ERROR on accept");
    exit(1);
    }
    // 进行数据传输...

5. 数据传输

  • 使用sendrecv进行数据的发送与接收。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char buffer[256];
    int n;

    n = recv(newsockfd, buffer, 255, 0); // 接收数据
    if (n < 0) {
    perror("ERROR reading from socket");
    }

    n = send(newsockfd, "Hello, world!", 13, 0); // 发送数据
    if (n < 0) {
    perror("ERROR writing to socket");
    }

6. 关闭套接字

  • 完成数据传输后,应关闭套接字以释放资源。
    1
    2
    close(newsockfd);
    close(sockfd);

7. 示例:简单的TCP服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 12345

int main() {
int sockfd, newsockfd;
struct sockaddr_in serv_addr, cli_addr;
socklen_t clilen;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("ERROR opening socket");
exit(1);
}

memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(PORT);

if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("ERROR on binding");
exit(1);
}

listen(sockfd, 5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
perror("ERROR on accept");
exit(1);
}

char buffer[256];
read(newsockfd, buffer, 255);
printf("Here is the message: %s\n", buffer);

close(newsockfd);
close(sockfd);
return 0;
}

8. 总结

  • 网络编程是一项重要的技能,熟悉套接字TCPUDP协议的使用。
  • 通过实例实践,加深对网络编程的理解与应用。

以上就是关于网络编程基础概念的详细内容。这为后续更复杂的网络程序奠定了重要基础。

31 C语言进阶到上手大纲

https://zglg.work/c-language-one/31/

作者

AI教程网

发布于

2024-08-08

更新于

2024-08-10

许可协议