我正在尝试编写一个非常基本的TCP / IP客户端,它只需要用户输入,将该输入发送到指定的IP,然后读取输出。下面的代码不返回任何错误代码,但输出仍未按预期返回。例如,我正在测试它的设备应该如下响应:
这里有一些输出
>
最后一个“>”设备将其返回给客户端以表示它已准备好接收更多输入。但是,使用我的代码返回的所有内容都是“>”。更奇怪的是,它只会在每个其他命令上返回该字符,其中之间没有返回任何内容。我怀疑这与我如何处理缓冲区有关;阅读CR和/或LF字符时可能存在冲突?有问题的设备可以通过telnet(同一台机器,同一个端口)完美地工作,而且我不确定我在这里做的不同。如果我能提供任何进一步的信息可以澄清我的问题,请告诉我。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
int ethwrite(char hostname[], int portno)
{
int sockfd, n; // file descriptor, number of chars
struct sockaddr_in serv_addr; // device address
struct hostent *server; // pointer to host object
char buffer[256];
while(true)
{
// open socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) return -1; // couldn't open socket
// parse host name
server = gethostbyname(hostname);
if (server == NULL) return -2;// host not found
// zero the server address array and parse
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
// connect to server
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
return -3; // couldn't connect
printf("Input: ");
bzero(buffer,256);
fgets(buffer,255,stdin); // take user input and write to buffer
// write command to socket
n = write(sockfd,buffer,strlen(buffer));
if (n < 0) return -4; // couldn't write to socket
// zero the buffer and read from the socket
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0) return -5; // couldn't read socket
printf("Output: %s\n",buffer);
close(sockfd); // close socket
}
return 0;
}
int main()
{
int status = ethwrite((char *)"10.13.70.230", 23);
printf("Returned status: %i\n",status);
return status;
}