CentOS 打开Socket:详解与操作指南

Socket 简介
Socket是计算机网络通信中的一种编程接口,它允许不同主机上的进程之间进行通信,在Linux系统中,Socket通常用于实现网络编程,如Web服务器、文件传输等,本文将详细介绍如何在CentOS系统中打开Socket。
Socket类型
在Linux系统中,Socket主要有以下三种类型:
流式Socket(Stream Socket):支持双向、有序、可靠的数据传输,如TCP协议。
数据报Socket(Datagram Socket):支持双向、无序、不可靠的数据传输,如UDP协议。
原始Socket(Raw Socket):允许用户访问网络协议栈,实现更底层的网络编程。
本文主要介绍流式Socket。

CentOS打开Socket步骤
安装必要的库
在CentOS系统中,首先需要安装libevent库,该库提供了非阻塞I/O操作,方便Socket编程,可以使用以下命令安装:
sudo yum install libevent libevent-devel
编写Socket程序
下面是一个简单的TCP客户端示例,用于连接服务器并发送数据:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int sockfd;
struct sockaddr_in servaddr;
// 创建Socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("192.168.1.100");
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connect");
exit(1);
}
// 发送数据
char buffer[1024];
strcpy(buffer, "Hello, Server!");
write(sockfd, buffer, strlen(buffer));
// 关闭Socket
close(sockfd);
return 0;
} 编译程序
使用gcc编译器编译上述程序:
gcc -o client client.c
运行程序

在另一个终端中,启动服务器程序,然后运行客户端程序:
./server ./client
FAQs
问题:如何获取Socket的IP地址和端口号?
解答:可以使用getsockname()函数获取Socket的本地地址和端口号,以下是示例代码:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int sockfd;
struct sockaddr_in localaddr;
// 创建Socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
// 获取本地地址和端口号
socklen_t len = sizeof(localaddr);
if (getsockname(sockfd, (struct sockaddr *)&localaddr, &len) < 0) {
perror("getsockname");
exit(1);
}
printf("Local IP: %s\n", inet_ntoa(localaddr.sin_addr));
printf("Local Port: %d\n", ntohs(localaddr.sin_port));
// 关闭Socket
close(sockfd);
return 0;
} 问题:如何实现Socket的非阻塞模式?
解答:可以使用fcntl()函数将Socket设置为非阻塞模式,以下是示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int sockfd;
struct sockaddr_in servaddr;
// 创建Socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(1);
}
// 设置Socket为非阻塞模式
int flags = fcntl(sockfd, F_GETFL, 0);
if (flags == -1) {
perror("fcntl");
exit(1);
}
if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) == -1) {
perror("fcntl");
exit(1);
}
// 设置服务器地址
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("192.168.1.100");
// 连接服务器
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connect");
exit(1);
}
// 发送数据
char buffer[1024];
strcpy(buffer, "Hello, Server!");
write(sockfd, buffer, strlen(buffer));
// 关闭Socket
close(sockfd);
return 0;
} 
