C 套接字中的单个字符,一次一个

C 套接字中的单个字符,一次一个,c,sockets,char,C,Sockets,Char,我正在用C编写一个基于文本的gui的小型telnetish游戏。 我需要从套接字中获取一个字符,而不需要“\n”,这样我就可以控制键 我有点像 16 char buffer[256]; 17 bzero(buffer,256); 18 n = read(sock,buffer,255); 但是read()只接受char* recv() 我找到了一种关闭telnet线路模式的方法,但这对我不起作用,或者我不理解 write(s,"\377\375\042\377\373\

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

我有点像

16     char buffer[256];
17     bzero(buffer,256);
18     n = read(sock,buffer,255);
但是
read()
只接受
char*

recv()

我找到了一种关闭telnet线路模式的方法,但这对我不起作用,或者我不理解

write(s,"\377\375\042\377\373\001",6);
根据我在论坛上的发现,可能有一种方法可以通过网络课程实现这一点

最好的方法是什么

我在干什么

 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 }
12无效数据处理(int sock)
13 {   
14 int n;
15国际一级;
16字符缓冲区;
17 n=recv(插座和缓冲器,1,0);
18如果(n<0)
19     {   
20 perror(“从插座读取错误”);
21出口(1);
22     }
23 printf(“消息:%c\n”,缓冲区);
24 n=写入(sock,“MSG SENT\n”,18);
25 }
read()
只接受
char*

char*
char[]
在C中基本上是等价的,当然是为了这个目的。很明显你甚至都没试过

recv()

否,
recv()
与套接字的
read()
相同,除非第四个参数非零,并且不需要传递
\n
即可获得它

我找到了一种关闭telnet线路模式的方法,但这对我不起作用,或者我不理解

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

这是
IAC DO LINEMODE
(255 253 36),客户端根本不应该发送它,然后是
IAC将回显(255 251 1)。正确的命令是
IAC WILL LINEMODE
(255 251 36)或“\377\373\042”,并且会有一个应答IAC DO LINEMODE(255 253 36或
“\377\375\042”
),即
IAC DO LINEMODE
,其中服务器允许您开始协商LINEMODE。我建议您研究更多细节,它相当复杂,需要与和其他人一起阅读。

如果您输入完整的代码,将更容易回答。如果您一次只想读取/recv 1个字符,为什么您要255个字符?就像我可以使用read()做的示例一样。它总是在读取缓冲区,即使我将它设置为1个字符,然后我就可以处理它了。对等方的行缓冲肯定是造成通信阻塞到行的原因。阅读RFC:嗯,我使用了netcat和netcat-t,同样的结果,不管怎样,进入阅读。对不起,你是对的,它们是一样的。然而,我的意思是,在我按下回车键之前,数据不会被发送。客户端:消息服务器:MSG:m与网络无关。。这与您如何捕获要发送到网络的数据有关。我知道。我要指出的是,我需要的是类似于while(c=getchar())方法的东西。你使用的代码没有问题。我会坚持关闭线路模式。