命令行参数场景下send-recv函数工作异常问题排查
客户端-服务器参数传递代码整理与注意事项
客户端发送代码
你这里是循环逐个发送命令行参数(从argv[3]开始),格式化后的代码如下:
for( i = 3; i < argc; i++) { //memset(buffer, '\0', sizeof(buffer)); //bzero(buffer, sizeof(buffer)); //strcpy(buffer, argv[i]); n = send(sockfd, argv[i], strlen(argv[i]), 0); //n = send(sockfd, buffer, strlen(buffer), 0); if(n <= 0 ) { perror("Error in writing2 : ", sockfd); return FAILURE; } }
服务器端接收代码
你提供的服务器端代码是截断状态,目前的代码片段如下:
for( j = 0; j < arg_no; j++) { //memset(buffer, '\0', sizeof(buffer)); bz...
几个关键问题提示
- 参数边界识别:当前发送逻辑只传了参数的纯内容,没有添加任何分隔标记(比如换行符、特殊字符),服务器端根本没法区分不同参数的边界,很可能把多个参数的内容拼接在一起,导致解析完全错误。建议在每个参数发送完成后,额外发送一个分隔符(比如
\n),或者先发送参数的长度值,再发送参数内容。 - 不完全传输处理:网络环境下
send和recv都可能只传输部分数据,不能默认一次调用就完成全部数据的收发。比如send返回的n可能小于strlen(argv[i]),这时候需要循环发送剩余的字节;服务器端的recv同理,要循环读取直到拿到完整的参数或分隔符。 - 缓冲区初始化:虽然你注释掉了客户端的缓冲区初始化,但服务器端接收时一定要确保缓冲区是干净的,否则残留的旧数据会干扰参数解析。
内容的提问来源于stack exchange,提问作者Ankit Negi
相关产品推荐
相关产品推荐

