Socket(套接字)是一种网络通信机制,允许不同计算机上的进程通过网络进行数据交换。在 Linux 系统中,Socket 是实现网络编程的基础。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int sockfd;
struct sockaddr_in server_addr;
// 创建 socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
close(sockfd);
exit(EXIT_FAILURE);
}
// 发送数据
char *message = "Hello, Server!";
send(sockfd, message, strlen(message), 0);
// 接收数据
char buffer[1024];
int bytes_received = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
buffer[bytes_received] = '\0';
printf("Received: %s\n", buffer);
// 关闭 socket
close(sockfd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
// 创建 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");
close(server_fd);
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, 3) < 0) {
perror("listen");
close(server_fd);
exit(EXIT_FAILURE);
}
// 接受连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
close(server_fd);
exit(EXIT_FAILURE);
}
// 接收数据
char buffer[1024] = {0};
int bytes_received = recv(new_socket, buffer, sizeof(buffer), 0);
printf("Received: %s\n", buffer);
// 发送数据
char *response = "Hello, Client!";
send(new_socket, response, strlen(response), 0);
// 关闭 socket
close(new_socket);
close(server_fd);
return 0;
}
原因:可能是网络延迟或服务器未响应。 解决方法:增加超时设置,检查服务器状态。
struct timeval timeout;
timeout.tv_sec = 5; // 5秒超时
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
原因:网络不稳定或程序逻辑错误。 解决方法:使用可靠的传输协议(如 TCP),增加数据校验机制。
原因:多个程序尝试绑定同一端口。 解决方法:检查正在运行的程序,更改端口号。
server_addr.sin_port = htons(8081); // 更改端口号
通过以上示例和解决方案,您可以更好地理解和应用 Linux 中的 Socket 编程。
腾讯云数据库TDSQL训练营
腾讯云数据库TDSQL(PostgreSQL版)训练营
算法大赛
Tencent Serverless Hours 第12期
北极星训练营
云+社区沙龙online [技术应变力]
Elastic Meetup Online 第三期
第135届广交会企业系列专题培训
Techo Youth
云+社区沙龙online第6期[开源之道]
企业创新在线学堂
企业创新在线学堂
领取专属 10元无门槛券
手把手带您无忧上云