C语言Linux下网络编程
时间: 2023-10-27 19:53:39 浏览: 119
网络编程方法在Linux操作系统下的研究.docx
在Linux下进行网络编程可以使用C语言提供的一些系统调用和库函数来实现。下面是一些常用的函数和步骤:
1. 创建套接字(Socket):使用`socket()`函数创建一个套接字,指定协议族(如AF_INET)、套接字类型(如SOCK_STREAM)和协议(如0表示自动选择)。
2. 绑定地址:使用`bind()`函数将套接字与本地地址绑定,指定IP地址和端口号。
3. 监听连接请求(对于服务器):使用`listen()`函数将套接字设置为监听模式,指定最大连接数。
4. 接受连接请求(对于服务器):使用`accept()`函数接受客户端的连接请求,返回一个新的套接字,用于与客户端进行通信。
5. 连接到服务器(对于客户端):使用`connect()`函数连接到服务器,指定服务器的IP地址和端口号。
6. 发送和接收数据:使用`send()`和`recv()`函数发送和接收数据,可以使用循环来确保完整的发送和接收。
7. 关闭套接字:使用`close()`函数关闭套接字,释放资源。
下面是一个简单的示例代码,演示了一个简单的服务器和客户端的通信:
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[MAX_BUFFER_SIZE] = {0};
char *message = "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( PORT );
// 绑定地址
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 接受连接请求
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 发送消息给客户端
send(new_socket, message, strlen(message), 0);
printf("Hello message sent\n");
// 接收客户端的消息
read(new_socket, buffer, MAX_BUFFER_SIZE);
printf("Client says: %s\n", buffer);
// 关闭套接字
close(new_socket);
close(server_fd);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
char buffer[MAX_BUFFER_SIZE] = {0};
char *message = "Hello from client!";
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 转换IP地址
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
perror("invalid address/ Address not supported");
exit(EXIT_FAILURE);
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("connection failed");
exit(EXIT_FAILURE);
}
// 发送消息给服务器
send(sock, message, strlen(message), 0);
printf("Hello message sent\n");
// 接收服务器的消息
read(sock, buffer, MAX_BUFFER_SIZE);
printf("Server says: %s\n", buffer);
// 关闭套接字
close(sock);
return 0;
}
```
这是一个简单的例子,仅用于展示网络编程的基本概念。在实际应用中,你可能需要处理更多的错误情况、添加更多的功能,并考虑网络传输的安全性和性能等因素。你可以根据具体需求调整代码。
阅读全文