如何解决如何正确实现select以正确从stdin和recv()获取数据
这是我的问题的延续:My attempt at netcat in C++ won't get me replies from the server 为了更好地理解我建议阅读的情况。根据我的理解,问题是程序可以从 getline()
或 recv()
上的 stdin 获取数据,但不能同时从两者中获取数据。所以我需要使用 select()
检查 recv()
的状态,以查看是否有任何数据要输出。我一直在研究 Unix 文件描述符并使用 select()
但是我似乎不太明白,或者至少我不知道如何将这些示例应用到我的程序中。那么,如何在我的代码中正确调用 select()
以便正确地从 recv()
获取数据?
我的代码:
#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <stdlib.h>
#include <errno.h>
using namespace std;
int main (int argc,char** argv) {
if (argv[1] == NULL) {
cout << "\033[31mTARGET NOT SPECIFIED - TERMINATING...\033[0m\n";
return -1;
}
if (argv[2] == NULL) {
cout << "\033[31mPORT NOT SPECIFIED - TERMINATING...\033[0m\n";
return -2;
}
string target = argv[1];
int port = atoi(argv[2]);
cout << "GENErating SOCKET...\n";
int chatter = socket(AF_INET,SOCK_STREAM,0);
if (chatter == -1) {
cout << "\033[31mSOCKET GENERATION FAILURE - TERMINATING...\033[0m\n";
return -3;
}
cout << "\033[32mSUCCESSFULLY GENERATED SOCKET\033[0m\n";
struct sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET,target.c_str(),&hint.sin_addr);
cout << "CONNECTING TO " << target << " AT PORT " << port << "...\n";
int connection_status = connect(chatter,(sockaddr*)&hint,sizeof(hint));
if (connection_status == -1) {
cout << "\033[31mCONNECTION FAILURE - TERMINATING...\033[0m\n";
return -4;
}
cout << "\033[32mCONNECTED TO HOST\033[0m\n";
char buf[4096] = {0};
string msg;
while (true) {
getline(cin,msg);
msg+"\r\n";
int sendmsg = send(chatter,msg.c_str(),msg.size()+1,0);
if (sendmsg == -1) {
cout << "\033[31mMESSAGE SENDING FAILURE - TERMINATING...\033[0m\n";
return -5;
}
int byterecv = recv(chatter,buf,4096,0);
if (byterecv == -1) {
cout << "\033[31mFAILURE TO RECEIVE MESSAGE - TERMINATING...\033[0m\n";
return -6;
}
cout << byterecv << "\n";
cout << buf << "\n";
}
close(chatter);
return 0;
}
虽然我需要帮助来修复程序,但我也认为了解如何使用 select 会帮助我了解它以及如何在未来使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。