作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图使其在用户键入“L”时运行 LIST 命令并显示所有可供下载的文件,但是当我运行它时,键入 L 后,程序会打印出“eetings”。我认为我没有正确使用 recv()、send() 或 fwrite() 命令,我是否遗漏了什么?当我输入时进一步注意
ncat 65.19.178.177 1234
在命令行中,它打印出“+OK Greetings”,但是当我在程序中输入“L”时,它打印出“eetings”,所以我认为它以某种方式从中获取。
void menu()
{
printf("L) List files\n");
printf("D) Download a file\n");
printf("Q) Quit\n");
}
int main(int argc, char **argv)
{
struct sockaddr_in sa;
int sockfd;
sa.sin_family = AF_INET;
sa.sin_port = htons(1234);
inet_pton(AF_INET,"65.19.178.177", &sa.sin_addr);
sockfd = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP);
if (sockfd == -1)
{
fprintf(stderr, "Can't create socket\n");
exit(3);
}
int res = connect(sockfd, (struct sockaddr *)&sa, sizeof(sa));
if (res == -1)
{
fprintf(stderr, "can't connect\n");
exit(2);
}
char buff[1000];
size_t rsize;
int resultcode;
//Get treeting from server. Expecting 220
rsize = recv(sockfd, buff, 1000, 0);
sscanf(buff, "%d", &resultcode);
if (buff[0]=='+')
{
printf("Success\n");
}
else
{
printf("Failed: Didn't get 220\n");
}
while(1)
{
menu();
char *choice = readline("Choice: ");
switch(choice[0])
{
case 'l':
case 'L':
//Handle L case
sprintf(buff, "LIST");
send(sockfd, buff, strlen(buff), 0);
while ((rsize = recv(sockfd, buff, 1000, 0)) > 0)
{
fwrite(buff, rsize, 1, stdout);
}
close(sockfd);
break;
最佳答案
也许这就是正在发生的事情(我认为这就是@Martin James 的意思):
在最初的 recv()
中,您不会检查 rsize
的值,但如果 buff[0] == '+'
之后。但你无法确定通过一次 recv()
调用是否收到了完整的问候语,也许只是 "+OK Gr"
而其余的仍然是等待接收。
现在您发送命令,但在收到命令结果之前,您将收到初始消息的其余部分,即“eetings”
你应该这样做:
int received = 0;
int expected = strlen( "+OK Greetings" );
rsize = recv(sockfd, buff, 1000, 0);
if( resize <= 0 || buff[0] != '+' ) {
// do some error handling and exit
..
}
received = rsize;
while( received < expected ) {
rsize = recv(sockfd, buff+received, 1000-received, 0);
if( resize <= 0 ) {
// do some error handling and exit
..
}
received += rsize;
}
调用 sscanf()
对我来说没有意义,因为根据您的问题,您没有收到数值。这是正确的吗?
附注:如果您无法访问“真正的调试器”,您可以随时在代码中添加一些 printf()
语句来查看发生了什么,就像:
rsize = recv(sockfd, buff, 1000, 0);
printf( "recv() returns %d\n", rsize );
关于c - fwrite 没有在缓冲区中发送我想要的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23764808/
我是一名优秀的程序员,十分优秀!