-1

我为客户端和服务器创建了一个 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'
4

1 回答 1

5

没有标准指定sys/socket.hTurbo C++ 3.0 支持的文件。例如,SuS v2IEEE 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 风格的字符串。您从套接字读取的数据只是原始数据,它不是 C 风格的字符串。所以你不能把它传递给fputs. 你扔掉了 的返回值read,所以你不知道你读了多少字节——你怎么期望fputs知道要写多少字节?

显然,您才刚刚开始学习 C。您必须是受虐狂才能使用 22 岁的编译器。看在神圣的份上,我希望你不要试图在上面学习 C++,因为你会学到对现代 C++ 完全错误的所有东西,并且会让自己大大倒退。我们这些长期从事 C++ 编程的人不得不付出很多痛苦来忘记旧的东西——如果你不需要的话,不要让自己经历这些。

于 2013-01-28T05:23:46.693 回答