为什么我的服务器没有向我的客户端发送任何内容
Why my server not sending anything to my client
我已经尝试在后台运行我的服务器,它显示在ps下,我可以看到我的服务器正在运行,但当我尝试运行客户端时,右侧服务器应该向客户端写入"成功连接到服务器",但那里没有任何输出。
我的服务器代码
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
using namespace std;
int main()
{
int serverFd;
int clientFd;
int serverLen;
int clientLen;
string message;
string serverSockAddrPtr;
struct sockaddr* serverSockAddressPnt;
struct sockaddr* clientSockAddressPnt;
struct sockaddr_un serverAddress;
struct sockaddr_un clientAddress;
cout << "" << endl;
cout << "Running server program 'css' ...... " << endl;
cout << "" << endl;
// SOCKET CREATION PART - SERVER
serverFd = socket (AF_LOCAL, SOCK_STREAM, 0);
/* Set domain type */
serverAddress.sun_family = AF_LOCAL;
/* Set name */
strcpy (serverAddress.sun_path, "CServer");
/* GET SIZE OF Server Addres */
serverLen = sizeof serverAddress;
/* GET SIZE OF Client Addres */
clientLen = sizeof clientAddress;
/* Get Server Sock Address Pointer*/
serverSockAddressPnt = (struct sockaddr *) &serverAddress;
/* Get Client Sock Address Pointer*/
clientSockAddressPnt = (struct sockaddr *) &clientAddress;
/* Create file */
bind (serverFd, serverSockAddressPnt , serverLen);
/* listen for connection */
listen (serverFd,5);
cout << "" << endl;
// SOCKET CREATION END - SERVER
while(1)
{
//accept client connection
clientFd = accept(serverFd, clientSockAddressPnt, (socklen_t*)&clientLen);
if(clientFd >= 0)
{
if(fork() == 0)
{
message="Successfully connected to the server";
write(clientFd,message.c_str(),strlen(message.c_str())+1);
close(clientFd);
exit(0);
}
else
close(clientFd);
}
}
return 0;
}
我的客户代码
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#define DEFAULT_PROTOCOL 0
#ifndef AF_LOCAL
#define AF_LOCAL AF_UNIX
#endif
#ifndef PF_LOCAL
#define PF_LOCAL PF_UNIX
#endif
using namespace std;
/* READ LINE FUNCTION*/
int readLine (int fd,char* str)
{
int n;
do
{
n = read(fd,str,1);
}while(n>0&& *str++ != 0);
return(n>0);
}
/* READ LINE FUNCTION END*/
/* READ SERVER FUNCTION*/
void readServer (int fd)
{
char str[500];
while (readLine(fd,str))
{
printf("%s",str);
}
}
/* READ SERVER FUNCTION END*/
int main()
{
int clientFd,serverLen,result;
struct sockaddr_un serverAddress;
struct sockaddr* serverSockAddressPnt;
/* Get Server Sock Address Pointer*/
serverSockAddressPnt = (struct sockaddr *) &serverAddress;
/* GET SIZE OF Server Addres */
serverLen = sizeof serverAddress;
clientFd = socket (AF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
serverAddress.sun_family = AF_LOCAL;
strcpy (serverAddress.sun_path,"CServer");
do
{
// a loop to keep trying till connected.
result=connect(clientFd,serverSockAddressPnt,serverLen);
if(result==-1)
{
//wait for 1 second to retry
sleep(1);
}
}while(result==-1);
readServer (clientFd);
close (clientFd);
exit(0);
return 0;
}
您的serverAddress
变量未初始化。我没有检查这个,但很可能serverAddress.sun_path
是指向char
的指针,然后它只是用一个随机值初始化的。这个
strcpy (serverAddress.sun_path,"CServer");
然后覆盖一些任意的内存。在C中,正确的方法是
struct sockaddr_un serverAddress = { 0 };
一般情况:
总是,总是,初始化所有变量。不要担心不这样做可能带来的一些小的效率提高。这通常是不值得的,而且在任何情况下,你还没有达到目的。(在这里,使用
0
进行适当的初始化会使程序从一开始就很好地崩溃。)编译时始终打开所有警告选项。
不要把C和C++混在一起。它们之间有细微的差异,这是不值得的。特别是在这里,你从使用C++中一无所获。
Pl。按照Joachim的建议,在代码中添加更多的错误处理。问题最可能的原因是您正在绑定,但在此之前,您没有删除要绑定的套接字文件(假设该文件在您进行实验后已经存在)(即"CServer")。
因此,即使绑定失败,但由于错误是热处理的,服务器也会启动(您可以通过ps命令看到它)。即使你可以看到服务器正在使用ps运行,你的客户端也无法连接。所以你可以通过在绑定之前取消套接字文件的链接(删除)来解决这个问题。
unlink("CServer");
bind (serverFd, serverSockAddressPnt , serverLen);
我希望这能解决你的问题。
分享教程的链接,我找到了http://tkhanson.net/cgit.cgi/misc.git/plain/unixdomain/Unix_domain_sockets.html
另一个观察结果是,您的代码将产生僵尸(Linux中的defunct processes ps命令将显示defunct条目),因为您还没有添加僵尸处理程序。
我建议,一个临时的解决方案是在服务器程序中的套接字调用之前添加下面的一行(假设是Linux)(还包括signal.h),以忽略SIGCHLD(子信号的死亡)。僵尸不会被看到。
signal(SIGCHLD, SIG_IGN);
客户端不知道要连接到哪个服务器。您可以执行struct sockaddr* serverSockAddressPnt;
,但这只会将serverSockAddressPnt
定义为指向struct sockaddr
的指针。但它应该被初始化或分配给要连接的服务器的ip地址。
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 用于本地网络运行的客户端服务器体系结构
- 检测grpc服务器中关闭的客户端连接
- 如何将请求的客户端连接的 IP 与 QTcpSocket 类中识别的 IP 之一进行比较?
- 为什么我的客户端无法连接到服务器?
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- C++ 套接字接受,连接的客户端列表
- 如何在C++中创建OpenVPN客户端?(不是 TUN/Tap 管理器,而是真正的客户端)
- 我无法在用C++编写的服务器和用 C# 编写的客户端之间建立 UDP 连接
- 为什么我不能将 new创建的客户端对象分配给unique_ptr
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- 如何使用 Python 实验室机器作为我的C++客户端代码的服务器
- 我的客户端服务器代码无法正常工作
- 为什么我的服务器没有向我的客户端发送任何内容
- 视觉对象 我的客户端连接类出了什么问题?C++
- 如何给我的客户端的最终QT应用程序
- 我如何使每个子进程获得不同的客户端地址(UDP套接字)
- 我怎么能重放TCP流到我的客户端