首先我们先选择一个端口号用于 TCP 或 UDP 网络通信。如果你运行一个服务或应用程序,监听端口就是通过该端口接收来自客户端的请求。
这里我们选择2048
先在ubuntu系统中输入netstat -anop | grep 2048,会显示以下信息 这代表此时2048端口号没有被占用
我们在ubuntu系统中用c编写以下程序
#include <stdio.h> // 标准输入输出库,用于打印和输入
#include <sys/socket.h> // 套接字相关函数
#include <netinet/in.h> // 定义了 IP 协议族相关的常量和结构体
#include <string.h> // 字符串处理函数
#include <unistd.h> // 系统调用接口,包括 close 函数
#include <arpa/inet.h> // 提供了 IP 地址转换函数等
int main() {
// 创建一个 TCP 套接字,返回套接字描述符
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == –1) {
perror(\”socket\”);
return –1;
}
// 配置服务器端的地址结构
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(struct sockaddr_in)); // 初始化地址结构为零
serveraddr.sin_family = AF_INET; // 使用 IPv4 地址
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到任意 IP 地址
serveraddr.sin_port = htons(2048); // 绑定到端口 2048
// 将服务器端地址和端口绑定到套接字上
if (–1 == bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr))) {
perror(\”bind\”);
return –1;
}
// 开始监听端口,最多允许 10 个连接排队
if (listen(sockfd, 10) == –1) {
perror(\”listen\”);
return –1;
}
// 等待客户端连接
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len); // 接受客户端连接
if (clientfd == –1) {
perror(\”accept\”);
return –1;
}
printf(\”Client connected\\n\”);
// 接收客户端数据
char buffer[128] = {
0}; // 缓冲区存放接收到的数据
int count = recv(clientfd, buffer, 128, 0); // 接收数据
if (count == –1) {
perror(\”recv\”);
close(clientfd);
return –1;
}
// 发送接收到的数据给客户端
send(clientfd, buffer, count, 0);
// 打印相关信息
printf(\”sockfd: %d, clientfd: %d, count: %d, buffer: %s\\n\”, sockfd, clientfd, count, buffer);
// 等待用户输入后关闭客户端连接
getchar();
close(clientfd); // 关闭客户端套接字
return 0; // 程序正常结束
}
代码解释:
创建套接字:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
使用 socket() 创建一个 TCP 套接字。AF_INET 表示使用 IPv4 地址族,SOCK_STREAM 表示创建一个流式套接
评论前必须登录!
注册