欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Linux TCP服务器客户端

Linux TCP服务器客户端

2025/5/16 4:15:38 来源:https://blog.csdn.net/m0_58341340/article/details/143818556  浏览:    关键词:Linux TCP服务器客户端

服务器端

#include <sys/types.h>          
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char *argv[]){if(argc != 3){fprintf(stderr, "Usage: %s <IP> <Port>\n", argv[0]); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}struct sockaddr_in my_addr, oth_addr;ssize_t recv_data;char buf[250];int socket_ret = socket(AF_INET, SOCK_STREAM, 0);if(socket_ret < 0){perror("socket"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}memset(&my_addr, 0, sizeof(my_addr)); // 修正:使用memset替代bzeromy_addr.sin_family = AF_INET;my_addr.sin_port = htons(atoi(argv[2])); // 注意:如果atoi(argv[2])结果过大,可能会溢出my_addr.sin_addr.s_addr = inet_addr(argv[1]); // 注意:如果argv[1]不是有效的IP地址,这里会返回INADDR_NONEif(bind(socket_ret, (const struct sockaddr *)&my_addr, sizeof(my_addr)) < 0){perror("bind"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}if(listen(socket_ret, 10) < 0){perror("listen"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);       }socklen_t len = sizeof(oth_addr);while(1){int client_socket = accept(socket_ret, (struct sockaddr *)&oth_addr, &len); // 修正:使用更明确的变量名if(client_socket < 0){perror("accept"); // 修正:提供完整的错误信息continue; // 修正:不退出程序,而是继续监听}printf("客户端地址为: %s\n", inet_ntoa(oth_addr.sin_addr)); // 修正:添加换行符\nmemset(buf, 0, sizeof(buf)); // 修正:使用memset替代bzerowhile (1){recv_data = recv(client_socket, buf, sizeof(buf) - 1, 0); // 修正:使用client_socket接收数据,并确保buf不会溢出if(recv_data > 0){printf("客户端发来:%s\n", buf); // 修正:添加换行符\n}}//close(client_socket); // 修正:关闭客户端套接字}// 注意:正常情况下,服务器套接字不应该在这里关闭,因为它需要持续监听新的连接// close(socket_ret); // 这行代码应该被注释掉或移除return 0;
}

客户端

#include <sys/types.h>          
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, char *argv[]){if(argc != 3){fprintf(stderr, "Usage: %s <IP> <Port>\n", argv[0]); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}struct sockaddr_in my_addr, oth_addr;ssize_t recv_data;char buf[250];int socket_ret = socket(AF_INET, SOCK_STREAM, 0);if(socket_ret < 0){perror("socket"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}memset(&my_addr, 0, sizeof(my_addr)); // 修正:使用memset替代bzeromy_addr.sin_family = AF_INET;my_addr.sin_port = htons(atoi(argv[2])); // 注意:如果atoi(argv[2])结果过大,可能会溢出my_addr.sin_addr.s_addr = inet_addr(argv[1]); // 注意:如果argv[1]不是有效的IP地址,这里会返回INADDR_NONE/*客户端不用绑定地址if(bind(socket_ret, (const struct sockaddr *)&my_addr, sizeof(my_addr)) < 0){perror("bind"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);}*//*客户端不用监听if(listen(socket_ret, 10) < 0){perror("listen"); // 修正:提供完整的错误信息exit(EXIT_FAILURE);       }*/int connect_ret = connect(socket_ret, (const struct sockaddr *)&my_addr, sizeof(my_addr));if (connect_ret < 0){perror("connect");exit(1);}//socklen_t len = sizeof(oth_addr);while(1){/*客户端不需要等待自己连接int client_socket = accept(socket_ret, (struct sockaddr *)&oth_addr, &len); // 修正:使用更明确的变量名if(client_socket < 0){perror("accept"); // 修正:提供完整的错误信息continue; // 修正:不退出程序,而是继续监听}*///printf("客户端地址为: %s\n", inet_ntoa(oth_addr.sin_addr)); // 修正:添加换行符\nmemset(buf, 0, sizeof(buf)); // 修正:使用memset替代bzerowhile (1){fgets(buf, sizeof(buf), stdin);recv_data = send(socket_ret, buf, sizeof(buf) - 1, 0); // 修正:使用client_socket接收数据,并确保buf不会溢出//if(recv_data > 0){//   printf("服务器发来:%s\n", buf); // 修正:添加换行符\n//}}//close(client_socket); // 修正:关闭客户端套接字}// 注意:正常情况下,服务器套接字不应该在这里关闭,因为它需要持续监听新的连接// close(socket_ret); // 这行代码应该被注释掉或移除return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词