我正在使用基于文本的gui用C编写一个小型的telnetish游戏。
我需要从套接字中获取单个字符,而无需使用'\n',这样我就可以控制键了。

我有类似的东西

16     char buffer[256];
17     bzero(buffer,256);
18     n = read(sock,buffer,255);

read()仅接受char *
recv()更好,但是您仍然需要传递'\n'来获取它。

我找到了一种关闭telnet线路模式的方法,但这对我不起作用,并且/或者我不理解。
write(s,"\377\375\042\377\373\001",6);

从我在一个论坛上发现的信息来看,可能有一种使用ncurses做到这一点的方法。

最好的方法是什么?

我在做什么
 12 void doprocessing (int sock)
 13 {
 14     int n;
 15     int i;
 16     char buffer;
 17     n = recv(sock,&buffer,1,0);
 18     if (n < 0)
 19     {
 20         perror("ERROR reading from socket");
 21         exit(1);
 22     }
 23     printf("MSG: %c\n",buffer);
 24     n = write(sock,"MSG SENT\n",18);
 25 }

最佳答案



出于这个目的,char *char[]在C中几乎是等效的。显然,您甚至都没有尝试过。



不,除非套接字的第四个参数不为零,否则recv()与套接字的read()相同,并且您无需传递\n即可获取。


write(s,"\377\375\042\377\373\001",6);

这是IAC DO LINEMODE(255 253 36),完全不应该由客户端发送,其后是IAC WILL ECHO(255 251 1)。正确的命令是IAC WILL LINEMODE(255 251 36)或“\377\373\042”,并且会有一个IAC DO LINEMODE响应(255 253 36或"\377\375\042"),它是IAC DO LINEMODE,服务器允许您开始协商线模式。我建议您学习RFC1116以获得更多详细信息,它相当复杂,需要与RFC854等一起阅读。

09-30 21:56