博客
关于我
TCP网络设计
阅读量:400 次
发布时间:2019-03-05

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

基于TCP协议的服务器和客户端编程指南

1. TCP服务器编程

服务器流程图
  • 创建socket:使用socket()函数创建一个TCP/IP套接字。
  • 绑定IP地址和端口:使用bind()函数将套接字绑定到指定IP地址和端口。
  • 设置监听:使用listen()函数设置套接字处于监听状态,允许最大数目的连接请求。
  • 等待连接:使用accept()函数阻塞,等待客户端连接请求。
  • 处理数据:读取客户端发送的数据,回复响应。
  • 关闭连接:关闭连接,返回服务。
  • 服务器代码示例
    #include 
    #include
    #include
    #include
    #include
    #include
    #define portnumber 3333int main(int argc, char *argv) { int sockfd, new_fd; struct sockaddr_in server_addr; struct sockaddr_in *client_addr; int sin_size, nbytes; char buffer[1024]; // 创建socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Socket error: %s\n", strerror(errno)); return 1; } // 初始化服务器地址结构 bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(portnumber); server_addr.sin_addr.s_addr = INADDR_ANY; // 绑定socket到IP地址和端口 if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) == -1) { printf("Bind error: %s\n", strerror(errno)); return 1; } // 设置最大连接数 if (listen(sockfd, 5) == -1) { printf("Listen error: %s\n", strerror(errno)); return 1; } // 等待客户端连接 while (1) { sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr **)&client_addr, &sin_size)) == -1) { printf("Accept error: %s\n", strerror(errno)); return 1; } // 显示客户端地址 printf("Connected by %s\n", inet_ntoa(client_addr->sin_addr)); // 读取数据 if ((nbytes = read(new_fd, buffer, 1024)) == -1) { printf("Read error: %s\n", strerror(errno)); return 1; } buffer[nbytes] = '\0'; printf("Received: %s\n", buffer); // 关闭连接 close(new_fd); } // 关闭服务器socket close(sockfd); return 0;}

    2. TCP客户端编程

    客户端流程图
  • 创建socket:使用socket()函数创建一个TCP/IP套接字。
  • 设置IP地址和端口:使用bind()函数设置套接字的IP地址和端口。
  • 连接服务器:使用connect()函数建立与服务器的连接。
  • 交换数据:使用read()和write()函数进行数据传输。
  • 关闭连接:使用close()函数关闭套接字。
  • 客户端代码示例
    #include 
    #include
    #include
    #include
    #include
    #include
    #define portnumber 3333int main(int argc, char *argv) { int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; // 检查命令行参数 if (argc != 2) { printf("Usage: %s hostname\n", argv[0]); return 1; } // 获取主机名 if ((host = gethostbyname(argv[1])) == NULL) { printf("Gethostbyname error\n"); return 1; } // 创建socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Socket error: %s\n", strerror(errno)); return 1; } // 初始化服务器地址结构 bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(portnumber); server_addr.sin_addr = *((struct in_addr *)host->h_addr); // 连接到服务器 if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { printf("Connect error: %s\n", strerror(errno)); return 1; } // 读取服务器响应 printf("Please input char:\n"); fgets(buffer, 1024, stdin); // 发送数据 if (write(sockfd, buffer, strlen(buffer)) == -1) { printf("Write error: %s\n", strerror(errno)); return 1; } // 关闭连接 close(sockfd); return 0;}

    3. 注意事项

  • 错误处理:每一步都要检查返回值,确保没有错误发生。
  • 网络地址转换:使用inet_ntoa()将网络地址转换为字符串,便于显示。
  • 端口号:确保服务器和客户端使用相同的端口号,以建立连接。
  • 阻塞与非阻塞:使用SOCK_STREAM类型的socket是阻塞的,适用于等待连接和数据交换。
  • 4. 常见错误

  • 权限问题:确保程序有权限绑定特定的IP地址和端口。
  • 网络环境:确认服务器和客户端位于同一网络,或者配置了防火墙规则允许通信。
  • 端口占用:使用netstat -tuln检查已有连接,避免端口冲突。
  • 通过以上步骤,可以实现基于TCP协议的服务器和客户端编程,实现数据的可靠传输和连接管理。

    转载地址:http://yebzz.baihongyu.com/

    你可能感兴趣的文章
    PPT添加视频的路径问题
    查看>>
    PPT美化插件 islide 安装过程问题“加载com加载项时运行出现错误”
    查看>>
    Prefix Tuning:详细解读Optimizing Continuous Prompts for Generation
    查看>>
    PreparedStatement 与Statement 的区别,以及为什么推荐使用 PreparedStatement ?
    查看>>
    PreparedStatement 查询 In 语句 setArray 等介绍。
    查看>>
    presentModalViewController显示半透明的一个view
    查看>>
    PresentViewController切换界面
    查看>>
    PyTorch之torch.utils.data.DataLoader解读
    查看>>
    PyTorch之DataLoader杂谈
    查看>>
    presto、druid、sparkSQL、kylin的对比分析
    查看>>
    Presto分布式大数据查询引擎
    查看>>
    Presto架构及原理
    查看>>
    Presto(一)集群部署
    查看>>
    Presto(二)开启安全认证
    查看>>
    Pricing procedure Steps and Details in SAP MM (from SCN)
    查看>>
    Prim 算法在不同权重范围内的性能分析及其实现
    查看>>
    Primace 5.0软件与KEIL单片机软件联合在线仿真步骤
    查看>>
    Prime Distance
    查看>>
    Prim求MST最小生成树
    查看>>
    Prim算法与Kruskal算法在均匀分布权重图中的性能比较
    查看>>