我正在使用基于文本的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等一起阅读。