【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)
在Linux系统中,套接字(socket)是一种允许进程进行网络通信的机制。套接字可以支持不同的网络协议,例如TCP和UDP。
在编写网络应用程序时,首先需要创建一个套接字,然后绑定到一个特定的地址和端口上,接着进行监听,最后处理客户端的连接和数据传输。
以下是一个简单的TCP服务器和客户端的例子,使用了基本的套接字编程概念:
服务器端代码(server.c):
#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";
// 创建一个套接字
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(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
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);
}
// 接收和发送数据
while (recv(new_socket, buffer, 1024, 0) > 0) {
printf("Received message: %s\n", buffer);
if (send(new_socket, greeting, strlen(greeting), 0) == -1) {
perror("send");
exit(EXIT_FAILURE);
}
bzero(buffer, 1024);
}
// 关闭套接字
if (close(server_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
return 0;
}
客户端代码(client.c):
#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;
}
// 创建一个套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设定服务器地址和端口
serv_addr.sin_family = AF_INET;
serv_addr.sin
评论已关闭