在使用 TCP 进行网络编程时,常用的 API 通常涉及以下几个方面:
1. Socket 创建和配置
- socket(): 创建一个新的 socket。
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
2. 地址结构设置
- sockaddr_in: 用于定义 IPv4 地址。
struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); // 设置端口号 inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr); // 设置IP地址
3. 绑定与监听(服务器端)
bind(): 将 socket 与指定的地址绑定。
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(): 将 socket 转换为被动模式,准备接受连接请求。
listen(sockfd, backlog);
accept(): 接受客户端的连接请求,并返回一个新的 socket 用于与客户端通信。
int client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_len);
4. 客户端连接(客户端)
- connect(): 发起与服务器的连接请求。
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
5. 数据发送和接收
send(): 向已连接的 socket 发送数据。
send(sockfd, buffer, length, flags);
recv(): 从已连接的 socket 接收数据。
recv(sockfd, buffer, length, flags);
6. 关闭连接
- close(): 关闭 socket,释放资源。
close(sockfd);
示例代码
以下是一个简单的 TCP 客户端和服务器示例。
TCP Server Example:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd;
struct sockaddr_in address;
int addrlen = sizeof(address);
// 创建套接字文件描述符
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);
// 将套接字绑定到指定地址和端口上
bind(server_fd,(struct sockaddr *)&address,sizeof(address));
// 开始监听
listen(server_fd , 3);
int new_socket;
// 接受来自客户端的连接请求
new_socket = accept(server_fd , (struct sockaddr *)&address,(socklen_t*)&addrlen);
// 向客户端发送数据
char *message = "Hello from server";
send(new_socket , message , strlen(message) , 0 );
close(new_socket);
close(server_fd);
return 0;
}
TCP Client Example:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
if ((sock = socket(AF_INET , SOCK_STREAM , 0)) < 0) {
printf("\n Socket creation error \n");
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("\nInvalid address/ Address not supported \n");
return -1;
}
if (connect(sock , (struct sockaddr *)&serv_addr , sizeof(serv_addr)) < 0) {
printf("\nConnection Failed \n");
return -1;
}
char buffer[1024] = {0};
read(sock , buffer , sizeof(buffer));
printf("%s\n",buffer );
close(sock);
return 0;
}
上述代码展示了基本的 TCP 服务端与客户端创建及数据传输过程。你可以根据需要进行修改和扩展。
内容由零声教学AI助手提供,问题来源于学员提问