linux简单的TCP与UDP的socket程序以及机器大小端的判断程序
发布日期:2025-04-10 01:25:18 浏览次数:11 分类:精选文章

本文共 3649 字,大约阅读时间需要 12 分钟。

Linux下TCP与UDP程序编写总结

本文将总结Linux下TCP与UDP程序的编写方法,并提供简单的实现示例。


TCP(基于链接)的简单程序结构

TCP是面向连接的协议,程序结构通常包括以下几个阶段:

  • 生成socket:使用socket()函数创建UDP或TCP socket。
  • 绑定socket:将socket绑定到特定的IP地址和端口。
  • 数据交换:接收客户端数据并发送响应。
  • 以下是一个简单的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:使用socket()函数创建UDP socket。
  • 绑定socket:将socket绑定到特定的IP地址和端口。
  • 接收数据:接收来自客户端的数据并发送响应。
  • 以下是一个简单的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类型来判断机器是大端机器还是小端机器。

    #include 
    union 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中编译运行即可查看机器的大小端。

    上一篇:linux算性质的命令,(linux命令学习)找到相应性质的文件并删除
    下一篇:linux简单***

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年05月01日 11时49分53秒