我为客户端和服务器创建了一个C程序,用于将数据从一台计算机传输到另一台计算机。 以下代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
int sockfd;
struct sockaddr_in saddr;
char *xyz,xyz1;
sockfd = socket(AF_INET,SOCK_STREAM,0);
saddr.sin_family = AF_INET;
saddr.sin_port=htons(5001);
saddr.sin_addr.s_addr = inet_aton("192.168.0.254");
connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
fgets(xyz);
write(sockfd,xyz,sizeof(xyz));
read(sockfd,xyz1,sizeof(xyz1));
fputs(xyz);
close(sockfd);
}
但它在trubo c ++ 3.0 IDE中显示以下错误
UNABLE TO OPEN INCLUDE FILE 'SYS/SOCKET.H'
UNABLE TO OPEN INCLUDE FILE 'NETINET/IN.H'
UNABLE TO OPEN INCLUDE FILE 'ARPA/INET.H'
答案 0 :(得分:5)
没有标准指定Turbo C ++ 3.0支持的sys/socket.h
文件。例如,SuS v2和IEEE 1003.1需要这样的标头,但TC ++ 3.0不支持其中任何一个。要么使用支持您计划编程的标准的编译器,要么只使用编译器支持的标准编程。
哦,你的代码有很多错误:
char *xyz,xyz1;
sockfd = socket(AF_INET,SOCK_STREAM,0);
saddr.sin_family = AF_INET;
saddr.sin_port=htons(5001);
saddr.sin_addr.s_addr = inet_aton("192.168.0.254");
connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));
fgets(xyz);
您没有将xyz
设置为任何特定值。您不能通过将其传递给fgets
来使用其值。你正在传递fgets
随机垃圾发生在未初始化的指针中。
write(sockfd,xyz,sizeof(xyz));
由于xyz
是指针,sizeof(xyz)
与sizeof(char *)
相同。你想写一些字节数等于平台上指针的大小?您需要告诉write
您希望它写入多少字节,而不是指针的大小。而且,xyz
再次指出任何东西,所以你不能使用它的价值。你正在传递write
未初始化变量的垃圾值。
read(sockfd,xyz1,sizeof(xyz1));
同样,您使用的sizeof(xyz1)
与sizeof(char *)
相同,而不是您想要的。在将xyz1
设置为任何内容之前,您还可以将read
的值传递给read
。它没有指向任何内容,因此您无法使用它来告诉 fputs(xyz);
将结果放在何处。
fputs
对于C风格的字符串,fputs
函数仅 。您从套接字读取的数据只是原始数据,它不是C风格的字符串。因此,您无法将其传递给read
。你丢弃fputs
的返回值,所以你不知道你读了多少字节 - 你期望{{1}}知道要写多少字节?
显然,你刚开始学习C.你必须是一个使用22岁的编译器的受虐狂。为了所有圣洁的缘故,我希望你不要试图在它上面学习C ++,因为你将学习现代C ++的一切完全错误并重新回归。我们这些长期以来一直在编程C ++的人不得不为了忘掉旧的东西而付出很大的痛苦 - 如果你不需要,就不要把自己放在那里。