本文共 3296 字,大约阅读时间需要 10 分钟。
#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;}
#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;}
inet_ntoa()将网络地址转换为字符串,便于显示。SOCK_STREAM类型的socket是阻塞的,适用于等待连接和数据交换。netstat -tuln检查已有连接,避免端口冲突。通过以上步骤,可以实现基于TCP协议的服务器和客户端编程,实现数据的可靠传输和连接管理。
转载地址:http://yebzz.baihongyu.com/