C - 使用read()从客户端到服务器读取整数

时间:2015-01-20 09:56:47

标签: c socketserver

我想从客户端向服务器发送一个号码。 我的代码是:

服务器

n= read( client_sockfd, &choice_client, 1 ); //read client's choice printf("%d\n", choice_client);

客户端

my_choice=1; //basically everything exept 0

n = write(sockfd , &my_choice, 1); //send choice to server

输出

  

0(所有时间)

3 个答案:

答案 0 :(得分:1)

您需要为给定类型设置足够的内存。

您正在编写整数或浮点变量值,因此您需要提供整数或浮点数的大小。

喜欢

n=read(client_fds,&choice_client,sizeof(int)); //sizeof(integer or float).

同样,你需要在写作时指定

n = write(sockfd , &my_choice, sizeof(int));

如果没有指定确切的大小,那么它将打印该变量的默认值或初始化值。

答案 1 :(得分:1)

实际上你可以发送数字,因为read和write都将void *作为参数。您只需将变量sizeof作为最后一个参数传递。

//Server code
n= read( client_sockfd, &choice_client, sizeof(choice_client) );        
printf("%d\n", choice_client);

//client code
my_choice=1;                                    
n = write(sockfd , &my_choice, sizeof(my_choice)); 

答案 2 :(得分:0)

您应该至少在编写良好的注释中定义客户端和服务器之间的协议(发送哪些消息,如何分隔它们)。调试textual消息协议通常更容易。因此,您可以考虑发送,每个行以换行符结束(或者使用标题和正文构造一些更复杂的消息,标题给出消息正文的大小。查看{{3} }或HTTP获取灵感。)

例如,您可能会确定每条消息都包含SMTP个编码数据,并且是换行符。小心JSON问题(服务器和客户端通常是不同的机器)。请参阅endianness(因此,将文本作为文本发送更简单)。

传输时间比文本格式编码的CPU时间长得多。

正如我评论的那样,你应该手动缓冲套接字I / O.因此,请在大型(例如16千字节)块上调用read(或recv)和write(或send),并让您的代码将这些块分成有意义的消息。不要指望一方的send(或write)对应于另一方的单recv(或read)。 TCP / IP套接字只是字节流(没有消息边界)。您应该使用read(或recv)或write(或send)的结果并相应地实施缓冲。

避免send - (或write - )短消息(例如每个一个或几个字节)。这通常效率很低。

byteorder(3)TCPread(2)recv(2)write(2)send(2)socket(7),{{上阅读wikipage 3}}等...手册页。