
linux简单的TCP与UDP的socket程序以及机器大小端的判断程序
生成socket:使用 绑定socket:将socket绑定到特定的IP地址和端口。 数据交换:接收客户端数据并发送响应。
生成socket:使用 绑定socket:将socket绑定到特定的IP地址和端口。 接收数据:接收来自客户端的数据并发送响应。
发布日期:2025-04-10 01:25:18
浏览次数:11
分类:精选文章
本文共 3649 字,大约阅读时间需要 12 分钟。
Linux下TCP与UDP程序编写总结
本文将总结Linux下TCP与UDP程序的编写方法,并提供简单的实现示例。
TCP(基于链接)的简单程序结构
TCP是面向连接的协议,程序结构通常包括以下几个阶段:
socket()
函数创建UDP或TCP socket。以下是一个简单的TCP服务器程序示例:
#include#include #include #include #include #define PORT 8900int main() { int sockfd; struct sockaddr_in server; char send_buf[2048]; char recv_buf[2048]; int length; int opt = SO_REUSEADDR; // 生成socket if (-1 == (sockfd = socket(AF_INET, SOCK_STREAM, 0))) { perror("生成socket失败"); exit(1); } // 绑定socket memset(&server, 0, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORT); if (-1 == bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr))) { perror("绑定失败"); close(sockfd); exit(1); } // 数据交换 while (1) { memset(send_buf, 0, sizeof(send_buf)); memset(recv_buf, 0, sizeof(recv_buf)); int recvnum = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&client, (socklen_t *)&length); if (recvnum == -1) { perror("接收数据失败"); break; } recv_buf[recvnum] = '\0'; printf("客户端消息: %s\n", recv_buf); // 发送响应 int sendnum = strlen(send_buf); sendto(sockfd, send_buf, sendnum, 0, (struct sockaddr *)&client, sizeof(struct sockaddr)); // 判断是否退出 if (0 == strcmp(recv_buf, "quit")) { close(sockfd); return 0; } } close(sockfd); return 0;}
UDP(无连接)的程序结构
UDP是无连接的协议,程序结构通常包括以下几个阶段:
socket()
函数创建UDP socket。以下是一个简单的UDP服务器程序示例:
#include#include #include #include #include #define PORT 8900int main() { int sockfd; struct sockaddr_in server; char send_buf[2048]; char recv_buf[2048]; int length; // 生成socket if (-1 == (sockfd = socket(AF_INET, SOCK_DGRAM, 0))) { perror("生成socket失败"); exit(1); } // 绑定socket memset(&server, 0, sizeof(struct sockaddr_in)); server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(PORT); if (-1 == bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr))) { perror("绑定失败"); close(sockfd); exit(1); } // 数据交换 while (1) { memset(send_buf, 0, sizeof(send_buf)); memset(recv_buf, 0, sizeof(recv_buf)); int recvnum = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&client, (socklen_t *)&length); if (recvnum == -1) { perror("接收数据失败"); break; } recv_buf[recvnum] = '\0'; printf("客户端消息: %s\n", recv_buf); // 发送响应 int sendnum = strlen(send_buf); sendto(sockfd, send_buf, sendnum, 0, (struct sockaddr *)&client, sizeof(struct sockaddr)); // 判断是否退出 if (0 == strcmp(recv_buf, "quit")) { close(sockfd); return 0; } } close(sockfd); return 0;}
大端与小端判断
在C语言中,我们可以通过union
类型来判断机器是大端机器还是小端机器。
#includeunion Nate { unsigned short s; char cs[2];} nate;int main() { nate.s = 1; printf("nate.s is : %x\n", nate.s); printf("nate.cs[0] is : %d\n", nate.cs[0]); printf("nate.cs[1] is : %d\n", nate.cs[1]); if (cate.cs[0] == 1) { printf("little endian!\n"); } else if (cate.cs[0] == 0) { printf("big endian!\n"); }}
在GCC中编译运行即可查看机器的大小端。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月01日 11时49分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux系统环境变量和别名设置(永久生效和临时生效)
2023-02-05
Linux系统用户和权限管理
2023-02-05
linux系统监控与硬盘分区/格式化/文件系统管理
2023-02-05
Linux系统程序安装(三)源码包安装程序
2023-02-05
Linux系统管理期末考试小结
2023-02-05
Linux系统终端与正确关机
2023-02-05
Linux系统编程:深入理解计算机软硬件体系和架构
2023-02-05
Linux系统调优实战
2023-02-05
Linux系统调用分析
2023-02-05
Linux系统轻量应用服务器CPU使用率高的排查与解决方案
2023-02-05
Linux系统通过netstat查看网络状态、端口状态
2023-02-05
Linux系统配置静态IP地址步骤
2023-02-05
linux系统重命名文件名,但文件名有空格如何处理
2023-02-05
linux线程
2023-02-05
linux线程同步的含义,Linux线程同步——条件变量
2023-02-05
Linux线程编程之生产者消费者问题
2023-02-05
Linux终端调试大全(非常详细)零基础入门到精通,收藏这一篇就够了
2023-02-05
Linux经典系统故障汇总与排障技巧及排障汇总表
2023-02-05