Tag: recv

recvfrom:错误地址,sendto:协议不支持的地址族

我正在尝试在C中实现一个小的UDP服务器/客户端应用程序,并在服务器端出现两个错误: recvfrom:错误的地址 && sendto:协议不支持的地址系列 。 我搜索了这个错误并搜索了答案,但不幸的是,他们并没有真正帮助…也许我正在以错误的方式投射参数并且没有得到它。 我希望你能给我一个提示:)。 #include #include #include #include #include #include #define BUFFSIZE 256 #define IP “127.0.0.1” #define PORT 7755 int main(void){ int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); char buffer[1] = “s”; struct sockaddr_in src_addr; struct sockaddr_in dest_addr; src_addr.sin_family = AF_INET; src_addr.sin_port = htons(PORT); src_addr.sin_addr.s_addr = inet_addr(IP); if(socket_fd==-1) perror(“socket”); if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1) […]

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

Recv有时只提供错误的文件描述符(运行程序它工作正常,有时它不起作用)

场景:我有一个客户端(订阅者),其中包含编译和工作的代码,我有所说客户端的服务器,我可以在不同的bash窗口运行它,我有printf来显示我正在发送什么消息,服务器得到了什么,看看客户是否收到确认……一切。 在代码的某些地方可能存在问题但是它或多或少有效,因为我可以发送消息等(这都在本地机器上)。 我停止程序运行,再次执行,并且可能发生两件事:它正常工作,我可以再次发送任何消息,或者当我尝试从客户端发送到服务器时,服务器关闭并且客户也是如此,没有收到确认。 我想解释一下,如果没有我编译或做任何事情,就会发生这种情况。 启动程序,再次运行,有时会失败。 我到目前为止唯一的事情(因为我对每次使用的电话都感到恐惧)是: RECV错误:文件描述符错误 我得到了这段代码: if((longitudRecibida=recv(fdSocketDevuelto, &longitudTema, sizeof(int), 0)) < 0){ close(sock_tcp); perror("RECV error"); exit(1); } 我没有放更多代码的原因是因为我根本不知道如何重现失败。 有时它工作正常,没有任何一点它停止,有时我发送的第一个消息使两个进程都失败。 当发生这种情况时,当我打印客户端的IP地址,而不是我得到的通常的127.0.0.1时,我得到: Peer IP address: 2385:6095:e37f:: 为了得到那个打印我使用: char ipstr[INET6_ADDRSTRLEN]; if (addr.ss_family == AF_INET) { struct sockaddr_in *s = (struct sockaddr_in *)&addr; port = ntohs(s->sin_port); inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct […]

为什么服务器在客户端应用程序处于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信号知之甚少,请考虑一下。

select和recvfrom出现意外结果

fd_set rset; struct timeval tv; FD_ZERO(&rset); FD_SET(sockfd, &rset); tv.tv_sec = 1; tv.tv_usec = 0; for(;;) { for(count = 0; count < elements in sockaddr_in array; count++) { //flag_array is filled with -1 before for(;;) if(flag_array[count] == -1 && select(sockfd+1, &rset, NULL, NULL, &tv)) { recvfrom(…) } tv.tv_sec = 1; FD_ZERO(&rset);//this fixed it FD_SET(sockfd, &rset);//and this […]

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

我正在编写一个小程序来请求一个文件块,然后让另一个程序返回该文件的特定块。 我可以使用最多大约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) […]

如何在C套接字中捕获“通过对等方重置连接”错误?

我有一个C ++和Qt应用程序,其中一部分实现了C套接字客户端。 前一段时间,应用程序崩溃了,因为服务器发生了一些事情; 我从崩溃中得到的唯一一件事就是Qt Creator的应用输出中的一条消息 recv_from_client:通过对等方重置连接 我在网上做了一些关于这个“同步连接重置”错误的研究,而SO和其他地方的一些线程确实设法解释了发生了什么,没有人告诉我们如何处理它 – 也就是说,我怎么能“捕获”错误并继续我的应用程序而不会崩溃(特别是我从服务器读取的方法是在while循环中,所以我想停止while循环并进入我的代码的另一个地方,将尝试重新建立连接)。 那么如何才能捕获此错误以正确处理它? 不要忘记我的代码实际上是带有Qt的C ++ – C部分是一个调用套接字方法的库。 编辑 顺便说一句,崩溃发生的可能方法(给出上面错误消息的“recv_from_client”部分)是: int hal_socket_read_from_client(socket_t *obj, u_int8_t *buffer, int size) { struct s_socket_private * const socket_obj = (struct s_socket_private *)obj; int retval = recv(socket_obj->client_fd, buffer, size, MSG_DONTWAIT); //last = 0 if (retval < 0) perror("recv_from_client"); return retval; } 注意:我不确定在发生此错误时, recv配置是使用MSG_DONTWAIT还是使用0 。

如何使用recv()检测客户端是否仍然连接(而不是挂起)?

我在SuSE Linux Enterprise Server 12.3(x86_64)上用C编写了一个多客户端服务器程序,我每个客户端使用一个线程来接收数据。 我的问题是: 我使用一个终端来运行服务器,并使用其他几个终端telnet到我的服务器(作为客户端)。 我已经在服务器中使用recv()来从客户端接收数据,我还应用了recv()返回值的检查,即错误在-1 ; Conn。在0和正常操作时关闭。 我没有在recv()使用任何标志。 如果我通常使用Ctrl+]关闭telnet会话(即断开客户端)并close ,我的程序工作正常,但如果我使用kill 强制终止客户端,那么我的服务器无法检测到连接丢失。 如何解决? 约束:我不想在客户端放置条件,我只想在服务器端解决此问题。

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

我有一个学校的任务,一部分是使用套接字编程从客户端向服务器发送一组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); […]

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