我为客户端和服务器创建了一个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);
}
Run Code Online (Sandbox Code Playgroud)
但它在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'
Run Code Online (Sandbox Code Playgroud)
没有标准指定sys/socket.hTurbo C++ 3.0支持的文件.例如,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);
Run Code Online (Sandbox Code Playgroud)
您没有设置xyz任何特定值.您不能通过传递它来使用它的值fgets.你正在传递fgets任何随机垃圾发生在未初始化的指针中.
write(sockfd,xyz,sizeof(xyz));
Run Code Online (Sandbox Code Playgroud)
既然xyz是指针,sizeof(xyz)就是一样sizeof(char *).您想写一些字节数等于平台上指针的大小?您需要告诉write您希望它写入多少字节,而不是指针的大小.并且,再次,xyz还没有指出任何东西,所以你不能使用它的价值.你正在传递write未初始化变量的垃圾值.
read(sockfd,xyz1,sizeof(xyz1));
Run Code Online (Sandbox Code Playgroud)
再次,你使用sizeof(xyz1),这是相同的,sizeof(char *)而不是你想要的.在将其设置为任何xyz1值之前,您还可以使用它的值,将其传递给read它.它没有指向任何东西,所以你不能用它来告诉read它的结果.
fputs(xyz);
Run Code Online (Sandbox Code Playgroud)
该fputs函数仅适用于C风格的字符串.您从套接字读取的数据只是原始数据,它不是C风格的字符串.所以你不能把它传递给fputs.你扔掉了返回值read,所以你不知道你读了多少字节 - 你怎么fputs想知道要写多少字节?
显然,你刚刚开始学习C.你必须是一个使用22岁的编译器的受虐狂.为了所有圣洁的缘故,我希望你不要在它上面学习C++,因为你将学习现代C++的一切完全错误并重新回归.我们这些长期以来一直在编程C++的人不得不为了忘掉旧的东西而付出很大的痛苦 - 如果你不需要,就不要把自己放在那里.