Tag: 客户端 服务器

RECV缓冲区为空,但返回值> 1

我正在尝试创建一个简单的服务器,以便两个客户端可以相互通信。 主服务器代码接受两个客户端连接,然后分叉使用execl在两个客户端之间生成个人服务器的进程,以便主服务器可以继续查找新连接。 一切似乎工作正常,直到个人服务器试图联系客户,他们都收到胡言乱语,如果有人知道是什么原因导致这一点请告诉我。 接受两个客户端后的主服务器: if(fork() == 0){ close(listener); int nBytes; char* playerOne[20]; char* playerTwo[20]; //Creates strings to hold file descriptor information for execl char connAscii[sizeof(int)]; char connAscii2[sizeof(int)]; snprintf(connAscii,sizeof(conn), “%d”, conn); snprintf(connAscii2,sizeof(conn2), “%d”, conn2); fprintf(stderr, “Int conn: %d, asciiConn: %s, backToInt: %d\n”, conn, connAscii, atoi(connAscii)); char *argf[2]; argf[0] = connAscii; argf[1] = connAscii2; fprintf(stderr, “that is […]

为什么服务器在客户端应用程序处于STOPPED状态后等待客户端?

这个问题是对此前提出的问题 的扩展 : 我用以下参数实现了jxh给出的解决方案 : SO_KEEPALIVE = Enabled TCP_KEEPIDLE = 120 secs TCP_KEEPINTVL = 75 secs TCP_KEEPCNT = 1 那为什么服务器仍然等待客户端响应? 我也在互联网上发现了这一点 kill 实际上将SIGTERM发送到给定进程。 所以我在“杀死”telnet应用程序后使用了ps -o pid,cmd,state命令。 我看到telnet进程仍然存在,但process state = T ,即它处于STOPPED状态 PS:我对Linux信号知之甚少,请考虑一下。

如何“杀死”Pthread?

我正在学习Pthreads,并想知道杀死这样一个对象的最佳方法是什么。 在寻找类似问题之后,我无法找到“明确”的答案,但请随时向我指出任何相关问题。 我正在使用一个小型客户端服务器应用程序,其中服务器主要的线程正在侦听客户端连接的套接字。 每次客户端连接时,服务器都会在while循环中创建一个执行“无限工作”的新线程。 现在我想在同一个客户端在套接字上发送“停止”请求时停止此循环。 如何通过每个套接字消息中提供的ID识别客户端,您将如何实现此类行为? 使用共享变量(在主服务器线程和客户端服务器线程之间)作为while循环中的tes条件。 使用PThreadfunction?

C-套接字:编程客户端/服务器 – 应用程序以发送文件

我想编写一个应用程序来发送带有套接字的文件: 我的服务器: void str_server(int sock) { char buf[1025]; const char* filename=”test.text”; FILE *file = fopen(filename, “rb”); err_abort(“Test”); while (!feof(file)) { int rval = fread(buf, 1, sizeof(buf), file); send(sock, buf, rval, 0); } } 在这里我的客户: void RecvFile(int sock, const char* filename) { int rval; char buf[0x1000]; FILE *file = fopen(filename, “wb”); while ((rval = recv(sock, buf, […]

服务器无法正确读取/打开客户端在C中发送的文件名

我正在与C中的套接字进行客户端/服务器交互。我要做的是让客户端请求在服务器上读取文件,服务器返回文件内容的缓冲区,客户端打印出来文件。 虽然我能够完成服务器向客户端发送文件缓冲区并且客户端成功打印出来,但我似乎无法让服务器成功读取客户端发送的文件名。 这就是我的意思: ///This is the structure of the message that gets sent back and forth struct message { int code; //Just indicates 1 or 2 for readfile or writefile int size; char buffer[256]; //This will hold the filename when client sends readfile request }; 作品: char *filename = “test.c”; infile = open(filename, O_RDONLY); //Send […]

如何在读取完成之前远程服务器关闭套接字时如何处理C中的套接字读取?

读取调用上的客户端块等待读取n个字节。 服务器写入n个字节并立即关闭连接。 如果在读取完成之前套接字关闭或由于某些其他问题,在这种情况下可以读取调用返回负数或零吗? (在这种情况下,客户端/服务器在同一个Linux机器上运行) 我正面临这样的情况,但不确定这在TCP / IP子系统中如何工作以及如何解决它。 Sever: write close Client: read close

C socket:recv并发送所有数据

我想获得类似于此的行为: 服务器运行 客户端运行 客户端键入“帮助”或其他命令 服务器响应得当 去3 问题是,当我的函数excCommand(“help”)运行时,只接收并打印一个小文本。 我的文本文件是这样的: COMMAND HELP: help – Display help quit – Shutdown client 仅打印命令帮助。 另一个问题是,当我键入命令时,没有打印任何内容,并且在2命令客户端退出之后。 特别是这件作品: while (quit) { getLine(“client> “, command, 10); if (strcmp(command, “quit”) == 0) quit = 0; else excCommand(command); } 这是服务器: #include #include #include #include #include “common.h” int main(int argc, char *argv[]) { if (argc != […]

使用POSIX消息队列而不是TCP套接字 – 如何建立“连接”?

我有客户端和服务器程序,现在通过TCP进行通信。 我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下)。 我希望它能提高性能(特别是通过减少延迟)。 我已经解决了大部分问题,但我不确定一件事:如何建立“连接”。 服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示: 服务器打开一个具有已知名称的队列并连续读取它(它可以像使用TCP一样使用select(2) )。 客户端打开三个队列:两个具有任意名称(包括一些唯一性,例如PID以避免冲突),以及一个具有服务器使用的已知名称的队列。 客户端向服务器的队列发送“连接”消息,包括客户端的队列名称(一个指定用于客户端到服务器的流量,另一个指定用于反向)。 服务器打开客户端连接消息中指定的队列,并开始从客户端到服务器读取(选择)。 客户端使用众所周知的名称关闭服务器队列。 使用客户端命名的两个队列(每个方向一个)进行双向通信。 您可能会看到此方案与常见的TCP方法类似,这并非偶然。 但是,我想知道: 你能想到更好的方法吗? 你看到我的方法有任何潜在的问题吗? 您是否有任何其他想法,包括在同一台计算机上使用消息队列而不是TCP实际上可以提高性能(延迟)的可能性? 请记住,之前我没有使用POSIX消息队列(我之前使用过IBM WebSphere MQ,但这有点不同)。 该平台是Linux。

在C / C ++中实现跨平台,multithreading服务器的最佳方法是什么?

我与之合作的开发团队的一部分面临着编写服务器以与我们的产品集成的挑战。 我们有一些提供C SDK的低级传感器设备,我们希望通过网络共享它们以供收集数据的人使用。 听起来很简单吧? 有人会将传感器设备连接到建筑物的一部分中的机器并运行我们的服务器,从而与网络的其余部分共享设备。 然后,客户端将通过我们的应用程序连接到该服务器,并从设备收集传感器读数。 我创建了一个简单的,与语言无关的网络协议,以及Java中的参考实现。 问题是创建一个实现,它将与我们的设备一起使用,这些设备仅提供用C编写的SDK。我们正在考虑执行以下操作: 创建轮询线程,收集并存储每个连接设备的最新读数。 使用multithreading服务器将每个传入连接分离到工作线程。 当工作线程收到传感器读取请求时,轮询线程收集的最新值将被发送回客户端。 这是很multithreading,特别是在C中。因此,要审查,一般要求是: 在Windows XP / Vista,Linux和OS X计算机上运行 用C或C ++编写,与我们拥有的C SDK进行交互 接受可变数量的同时连接(工作线程) 必须使用线程,而不是分叉(不想处理另一层IPC) 谁能建议一个库,最好是一些示例代码才能开始使用?

C:“所有客户端连接的相同文件描述符”(客户端服务器编程)

在每个新客户端连接分叉服务器进程 不同的进程(服务器的其他子进程,即exec)无法识别在分叉子进程中使用相同fd的客户端。 如何区分其他进程的客户端? 如果文件描述符是新的sockfd,则accept调用返回相同的值 /* server process */ #include #include #include #include #include #define SIZE sizeof(struct sockaddr_in) void catcher(int sig); int newsockfd; int main(void) { int sockfd; char c; struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY}; static struct sigaction act; act.sa_handler = catcher; sigfillset(&(act.sa_mask)); sigaction(SIGPIPE, &act, NULL); /* set up the transport end point */ […]