一个简单的C或C++ TCP服务器和客户端示例是什么?

49

我需要快速实现一个非常小的C或C++ TCP服务器/客户端解决方案。这只是简单地从一台计算机传输一个字节数组到另一台计算机,不需要可扩展性和过于复杂的功能。越简单越好,如果可以的话尽可能地快速和粗略。

我尝试使用此教程中的代码,但我无法在Linux下使用g++构建它:http://www.linuxhowtos.org/C_C++/socket.htm

如有可能,我想避免使用第三方库,因为我运行该系统的计算机相当受限制。这必须是C或C++,因为现有的应用程序已经实现了这种语言。

感谢emg-2的答案,我成功地使上述代码示例与C++兼容,并采用以下步骤:

将这些头文件添加到客户端和服务器:

#include <cstdlib>
#include <cstring>
#include <unistd.h>

server.c 中,将 clilen 的类型更改为 socklen_t。

int sockfd, newsockfd, portno/*, clilen*/;
socklen_t clilen;

client.c中,更改以下行:

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) { ... }

收件人:

if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
5个回答

50

我曾使用过Beej的网络编程指南,它是用C语言编写的,而不是C++,但例子很好。直接跳转到第6节查看简单的客户端和服务器示例程序。


谢谢 - 我找到了一个示例(http://beej.us/guide/bgnet/output/html/multipage/clientserver.html#simpleserver),但我不确定它是否太过复杂,我真的需要所有那些代码吗? - Nick Bolton
@nickbolton2705:很可能是的。Beej的代码包含错误处理,这也是我喜欢它的原因之一。还要注意服务器支持多个并发连接以及IPv4和IPv6。 - Bill the Lizard
是的,这将是一个优雅解决方案 - 我注意到其中一个功能是序列化,如果我在某个时候需要正确实现它,那么这将非常有用。 - Nick Bolton
1
上帝保佑Beej。他的教程是我小时候第一次接触*NIX套接字编程的经历。我不经常使用C/C++,无法完全记住所有内容,所以每当我需要复习时,我总是寻求Beej的指导。 - William
1
此答案中使用的链接已过期,请现在使用此链接 - divinelemon

15

如果代码应该简单,那么您可能正在寻找基于传统BSD套接字的C示例。像boost::asio这样的解决方案在短而简单的“hello world”示例方面相当复杂。

要编译您提到的示例,您必须进行简单的修复,因为您正在使用C++编译器进行编译。我指的是以下文件:
http://www.linuxhowtos.org/data/6/server.c
http://www.linuxhowtos.org/data/6/client.c
来自:http://www.linuxhowtos.org/C_C++/socket.htm

  1. 在两个文件中添加以下包含:

    #include <cstdlib>
    #include <cstring>
    #include <unistd.h>
    
  2. client.c中,将以下行更改为:

    if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0)
    { ... }
    

    变成:

    if (connect(sockfd,(const sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
    { ... }
    

正如您所看到的,在C++中需要使用显式转换。


1
另外,在 server.c 中,我不得不将 clilen 的类型更改为 socklen_t,并转换 sizeof(cli_addr) 的输出。 - Nick Bolton

5

1
这些示例是否合适?http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/iostreams/daytime_server.cpphttp://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/iostreams/daytime_client.cpp - Nick Bolton

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接