我想从客户端向服务器发送一个号码。 我的代码是:
服务器
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(所有时间)
答案 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)和TCP,read(2),recv(2),write(2),send(2),socket(7),{{上阅读wikipage 3}}等...手册页。