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 […]

链接在TCP连接中关闭时发送()函数行为

以下是场景: A B. 我在A和B(基于Linux的机器)上使用非阻塞套接字。 A和B有一个TCP连接,突然连接它们的链接断开(链接可能不是直接链接)。 现在链接断开后,当在A侧调用send()函数向B发送一些数据时,它会成功返回(即它返回要发送的字节数)。 当链接断开时,当我们知道远程端无法接收此数据时,这种行为的原因是什么?

套接字中的网络字节顺序

我正在学习c(Linux)中的套接字编程,我无法理解为什么在发送整数时需要使用htonl,而不是在发送字符串(char *)时。 我读过很多论文,但我仍然不知道为什么。

MPI_Gather()将中心元素转换为全局矩阵

这是来自MPI_Gather 2Darrays的后续问题。 情况如下: id = 0 has this submatrix |16.000000| |11.000000| |12.000000| |15.000000| |6.000000| |1.000000| |2.000000| |5.000000| |8.000000| |3.000000| |4.000000| |7.000000| |14.000000| |9.000000| |10.000000| |13.000000| ———————– id = 1 has this submatrix |12.000000| |15.000000| |16.000000| |11.000000| |2.000000| |5.000000| |6.000000| |1.000000| |4.000000| |7.000000| |8.000000| |3.000000| |10.000000| |13.000000| |14.000000| |9.000000| ———————– id = 2 has this submatrix […]

不寻常的选择/袜子流行为行为

我正在编写一个小程序来请求一个文件块,然后让另一个程序返回该文件的特定块。 我可以使用最多大约555000字节的文件来使用它,但是在比这更大的任何事情上,我得到了不寻常的行为。 在我的循环中,我检查进度缓冲区,它是一个整数数组,以查看我是否有一个特定的文件块。 如果我这样做,那么我不会发送对该块的请求,但如果我没有,那么我从对等方请求块。 我有一个链接列表,我移动了,列表中的每个对等方都有一个与之关联的sockfd。 所以,从某种意义上说,我“循环”了这些要求。 一旦我把它们发出去,我就会等待消息进来。我不知道这是否是最好的方法,但它似乎是最自然的。 但是,对于较大的文件,它会在select调用时挂起。 我不完全确定为什么。 如果有人能够对此有所了解,或建议采取更好的方法,我很乐意听到。 这是我的代码。 我没有包含我调用的函数的代码,但我认为在这种情况下它不是必需的(它们是Beej的sendall和recvall函数的修改版本)。 还值得一提的是,这是一个multithreading应用程序(使用pthreads),但我没有使用任何共享变量。 感谢您抽时间阅读! total = (number of chunks in the file) my_peers = (linked list of peer structs containing sockfds, etc) int i; progress_buf = (array of ints, each representing a chunk in a file, 0 means we don’t have the chunk) while (1) […]

如何处理生成它的对象内的SIGPIPE错误?

我有两个应用程序,一个服务器和另一个客户端,都是用C ++和Qt编写的,但它们都使用C库,它使用C套接字方法在它们之间执行套接字通信(这一切都在Linux中)。 当它们都连接并关闭客户端时,当服务器尝试向其发送新消息时,它会收到SIGPIPE错误并关闭。 我在网上做了一些研究,在SO中看看如何为SIGPIPE创建一个处理程序,而不是关闭应用程序,我告诉定时器不断发送信息停止。 现在我确实学会了如何简单地处理信号:创建一个方法,在main()或global(内部)中接收int和使用信号(SIGPIPE,myMethod)(注意:从SO中学到了,是的,我知道signal()已经过时了)。 但问题是,通过这种方式,我无法停止向死客户端发送信息,因为处理信号的方法需要在发送消息的类之外或者静态方法,有权访问我的服务器对象。 为了澄清,这是当前的架构: //main.cpp void signal_callback_handler(int signum) { qDebug() << "Caught signal SIGPIPE" << signum << "; closing the application"; exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setApplicationName("ConnEmulator"); app.setApplicationVersion("1.0.0"); app.setOrganizationName("Embrasul"); app.setOrganizationDomain("http://www.embrasul.com.br"); MainWidget window; window.show(); /* Catch Signal Handler SIGPIPE */ signal(SIGPIPE, signal_callback_handler); return app.exec(); } // MainWidget类(简化) […]

从结构,套接字编程发送数据

我有一个学校的任务,一部分是使用套接字编程从客户端向服务器发送一组int,chars char *。 发送整数或字符的工作正常,但有没有办法将整个结构作为一个数据包发送? 阅读有关序列化的内容,但我似乎无法使其正常工作。 这是一段代码: The struct looks like this: struct Msg { int a; char b; char *user; }; Client: init variables and such… int netcom(char* ip, int port) { sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // clear the structure bzero(&serveraddr, sizeof(struct sockaddr_in)); serveraddr.sin_family = AF_INET; // add the server adress inet_pton(AF_INET, ip, &serveraddr.sin_addr); […]

TCP / UDP和以太网MTU碎片

我在线阅读了各种网站和教程,但我仍感到困惑。 如果消息大于IP MTU,则send()返回发送的字节。 消息的其余部分会发生什么? 我是否再次调用send()并尝试发送其余消息? 或者是IP层应该自动处理的东西?

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 != […]

MPI_Gather 2D数组

N是4, N_glob 。 它恰好是相同的大小。 p是4。 这是代码的一小部分: float **global_grid; float **gridPtr; lengthSubN = N/pSqrt; subN = lengthSubN + 2; grid = allocate2D(grid, subN, subN); .. MPI_Type_contiguous(lengthSubN, MPI_FLOAT, &rowType); MPI_Type_commit(&rowType); .. gridPtr = grid; .. MPI_Barrier(MPI_COMM_WORLD); if(id == 0) { global_grid = allocate2D(global_grid, N_glob, N_glob); } MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&(gridPtr[0][0]), 1, rowType, &(global_grid[0][0]), 1, rowType, 0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); if(id […]