• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
banmaxx
博客园    首页    新随笔    联系   管理    订阅  订阅

socket通信C语言实现示例

参考开源代码记录一下如何使用C语言编写套接字通信框架

单机本地套接字通信

C语言编程注意事项

  • 在window系统下较linux系统需要多一步初始化网络环境的操作`

    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("初始化Winsock失败\n");
        return -1;
    }
    printf("初始化Winsock成功\n");`
    
  • 头文件应包含#include <winsock.h>,为方便代码的移植,省去对项目属性的更改依赖,可以使用预编译命令实现在代码中指定对特定库的链接#pragma comment(lib,"ws2_32.lib")

服务端程序

  • 创建socket`

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        perror("Socket creation failed");
        return 1;
    }`
    
  • 配置socket`

    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    
    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("Bind failed");
        return 1;
    }`
    
  • 开启监听`

    if (listen(sockfd, 5) == -1) {
        perror("Listen failed");
        return 1;
    }
    
    printf("Server listening on port %d\n", PORT);`
    
  • 进入等待连接的循环

    while (1) {
            // 接受连接
            int client_len = sizeof(struct sockaddr_in);
            int client_fd = accept(sockfd, (struct sockaddr*)&server_addr, &client_len);
            if (client_fd == -1) {
                perror("Accept failed");
                continue;
            }
    
            //// 与客户端通信的循环
            while (1)
            {
                /*在这里键入链接成功后将要持续执行的代码*/
            }
    
            // 关闭连接
            closesocket(client_fd);
        }
    
  • 连接成功后开始通信

    while (1)
            {
                char szData[BUFFER_SIZE];
                int ret = recv(client_fd, szData, sizeof(szData) - 1, 0);
    
                if (ret > 0)
                {
                    szData[ret] = '\0'; // 添加字符串结束符
                    printf("5. 接收客户端数据成功[%s]\n", szData);
    
                    // 发送回显数据
                    ret = send(client_fd, szData, ret, 0);
                    if (ret == SOCKET_ERROR)
                    {
                        printf("发送数据失败\n");
                        break; // 发送失败,断开与该客户端的连接
                    }
                }
                else if (ret == 0) // 客户端关闭连接
                {
                    printf("客户端已主动断开连接。\n");
                    break; // 正常退出循环,准备处理下一个客户端
                }
                else // 发生错误
                {
                    printf("接收客户端数据失败\n");
                    break; // 错误处理后断开连接
                }
            }
    
posted @ 2025-01-18 18:18  Georgezhangx  阅读(40)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3