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

    你可能感兴趣的文章
    Objective-C实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法(附完整源码)
    查看>>
    Objective-C实现PrimeFactors质因子分解算法 (附完整源码)
    查看>>
    Objective-C实现prim普里姆算法(附完整源码)
    查看>>
    Objective-C实现PriorityQueue优先队列算法(附完整源码)
    查看>>
    Objective-C实现proth number普罗斯数算法(附完整源码)
    查看>>
    Objective-C实现pythagoras哥拉斯算法(附完整源码)
    查看>>
    Objective-C实现QLearning算法(附完整源码)
    查看>>
    Objective-C实现QR正交三角分解法算法(附完整源码)
    查看>>
    Objective-C实现qubit measure量子位测量算法(附完整源码)
    查看>>
    Objective-C实现Queue队列算法(附完整源码)
    查看>>
    Objective-C实现quick select快速选择算法(附完整源码)
    查看>>
    Objective-C实现rabin-karp算法(附完整源码)
    查看>>
    Objective-C实现radians弧度制算法(附完整源码)
    查看>>
    Objective-C实现radianToDegree弧度到度算法(附完整源码)
    查看>>
    Objective-C实现radix sort基数排序算法(附完整源码)
    查看>>
    Objective-C实现rail fence围栏密码算法(附完整源码)
    查看>>
    Objective-C实现rayleigh quotient瑞利商算法(附完整源码)
    查看>>
    Objective-C实现RC4加解密算法(附完整源码)
    查看>>
    Objective-C实现RC4加解密算法(附完整源码)
    查看>>
    Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
    查看>>