【Linux】网络基础和网络套接字的概念
在Linux中,网络基础包括OSI模型、TCP/IP协议、网络设备(如网卡、调制解调器)、网络配置工具(如ifconfig、ip)等。
网络套接字(Socket)是一种抽象层,应用程序可通过它发送或接收数据,就像与另一个网络设备的进程在交谈。套接字是网络通信的基本构件,它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接的本地地址、连接的本地端口号、连接的远端地址、连接的远端端口号、传输层协议。
解决方案:
- 网络基础知识:
理解OSI模型和TCP/IP协议栈的不同层次及其功能。
- 网络套接字编程:
在Linux中,可以使用BSD套接字API进行网络编程。以下是一个简单的TCP服务器和客户端示例代码:
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *greeting = "Hello from server";
// 创建socket文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定socket到地址和端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听socket
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接受客户端的连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收客户端消息
if (recv(new_socket, buffer, 1024, 0) == 0) {
printf("Client disconnected\n");
exit(0);
}
printf("Received message: %s\n", buffer);
// 发送消息到客户端
send(new_socket , greeting, strlen(greeting), 0);
// 关闭socket
close(new_socket);
close(server_fd);
return 0;
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[]) {
int sock;
struct sockaddr_in serv_addr;
char buffer[1024] = {0};
if (argc < 2) {
printf("Please provide the server ip address as first argument\n");
return 1;
}
评论已关闭