博客
关于我
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/

    你可能感兴趣的文章
    php设计模式 萨莱 pdf,PHP设计模式 建造者模式
    查看>>
    PHP设计模式之----观察者模式
    查看>>
    php设计模式之装饰器模式
    查看>>
    R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)
    查看>>
    PHP设计模式:观察者模式
    查看>>
    php访问mysql(1)
    查看>>
    php详细学习1
    查看>>
    php语言优劣
    查看>>
    PHP语言最优雅的支付SDK扩展包
    查看>>
    PHP请求https域名发生segment fault段错误
    查看>>
    PHP读写XML文件
    查看>>
    PHP读写XML文件
    查看>>
    R&Python Data Science 系列:数据处理(3)
    查看>>
    php读取xml 数据库字段超长处理
    查看>>
    php课程 12-40 抽象类的作用是什么
    查看>>
    php课程 4-16 数组自定义函数(php数组->桶)
    查看>>
    PHP调用接口用post方法传送json数据
    查看>>
    php转化IP为整形
    查看>>
    php输出数据到csv文件
    查看>>
    php输出语句
    查看>>