Tag: sockets

如何知道客户端是否已在套接字中终止

假设在编写此代码后我有一个连接的套接字.. if ((sd = accept(socket_d, (struct sockaddr *)&client_addr, &alen)) < 0) { perror("accept failed\n"); exit(1); } 如何在服务器端知道客户端已退出。 我的整个程序实际上做了以下.. 接受来自客户端的连接 启动一个新线程,该线程从该特定客户端读取消息,然后将此消息广播到所有连接的客户端。 如果你想看到整个代码……在这整个代码中。 我还在努力解决另外一个问题,每当我用Ctrl + C杀死一个客户端时,我的服务器突然终止.. 如果有人能提出问题是什么 ,那就太好了。 #include #include #include #include #include #include #include #include #include #include #include #include /*CONSTANTS*/ #define DEFAULT_PORT 10000 #define LISTEN_QUEUE_LIMIT 6 #define TOTAL_CLIENTS 10 #define CHAR_BUFFER 256 /*GLOBAL VARIABLE*/ int current_client […]

如何比较C中的套接字地址?

我的意思是,当我检查两个struct sockaddr是否具有相同的IP地址和端口号时,我应该比较struct sockaddr哪些字段? 那么sockaddr_in呢? 我可以将sockaddr_in为sockaddr ,并将其与真正的sockaddr进行比较吗?

查询选择系统调用

select()定义为: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout); nfds表示所有给定集合中的最高文件描述符加1。 我想知道为什么fd_set信息可用时select()需要这些数据。 如果集合中的FD是4,8,9,那么nfds的值将是10. select()moniter fds 9,8,7,6,5,4?

跨平台sockets

我知道,Windows不使用UNIX套接字,而Mac OS则使用UNIX套接字。 在此之前,我的软件是跨平台的,没有任何代码更改。 但现在我想要它做一些网络通信。 我知道POSIX套接字,但我对Windows的信息一无所知。 目标是实现一个简单的跨平台套接字服务器。 能否请您解释POSIX和Winsock套接字之间的区别以及如何编写跨平台网络代码?

为什么我不能将ipv6套接字绑定到linklocal地址

#include #include #include #include #include void error(char *msg) { perror(msg); exit(0); } int main(int argc, char *argv[]) { int sock, length, fromlen, n; struct sockaddr_in6 server; struct sockaddr_in6 from; int portNr = 5555; char buf[1024]; length = sizeof (struct sockaddr_in6); sock=socket(AF_INET6, SOCK_DGRAM, 0); if (sock < 0) error("Opening socket"); bzero((char *)&server, length); server.sin6_family=AF_INET6; server.sin6_addr=in6addr_any; server.sin6_port=htons(portNr); […]

查询用于套接字编程的头文件中使用的语法

这是我从一个用于套接字编程的头文件中复制的代码片段。 /* Structure describing an Internet socket address. */ struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr’. */ unsigned char sin_zero[sizeof (struct sockaddr) – __SOCKADDR_COMMON_SIZE – sizeof (in_port_t) – sizeof (struct in_addr)]; }; 我能理解sin_port和sin_addr的声明。 但是__SOCKADDR_COMMON in_)在这里。 我无法理解这种语法? 请解释一下。 […]

通过C中的套接字发送文件

我在学校找到了一个用C语言编写FTP程序的任务(用于Linux)。 我已经完成了所有基本function(ls,cd),但是我遇到了文件传输部分的麻烦。 我使用sendfile通过套接字发送文件,如下所示: int fd = open(temp, O_RDONLY); int rc = sendfile (client_fd, fd, &offset, statbuf.st_size); 我似乎无法弄清楚如何在客户端接收此文件。 我这样尝试调试: while( (i = read(sock, message, MSG_LEN – 1)) > 0 ) { message[i] = ‘\0’; printf(“%s”, message); } 这在打印文本文件方面做得很好,但是如果我尝试发送二进制文件,例如,它只打印出二进制文件的开头并挂在read()部分(因为没有任何东西来自服务器,我认为)。 我很感激任何建议!

UDP套接字使用select()

嗨,我正在创建一个代理服务器,等待来自客户端的数据包与UDP连接,并检查是否所有这些都是有效到达或相同的已被拒绝。 在这种情况下,我应该为每个丢失的数据包(使用send_ack())向客户端发送“确认”,但在发送了第一个确认之后,发送无限制的选择循环的“if部分”永远不会返回到“其他”部分“是来自客户端的选择监听数据(接收_pkt()函数) fd_set rset, allset; int maxfd, nready; struct timeval timeout; timeout.tv_sec = 4; timeout.tv_usec = 150000; maxfd = socketfd; FD_ZERO(&allset); FD_SET(socketfd, &allset); rset = allset; for( i=0; ;i++){ do { nready=select( (maxfd +1), &rset, NULL, NULL, &timeout); } while ((nready<0) & (errno==EINTR)); if( nready<0) { perror("Error main: select failed: "); exit(32); } if( nready==0){ […]

多个子进程在同一个管道上读/写

我目前正在Linux环境中使用C学习套接字编程。 作为一个项目,我试图编写一个基本的聊天服务器和客户端。 目的是让服务器为每个连接的客户端分叉一个进程。 我遇到的问题是在一个孩子中读取数据并将其写入所有连接的客户端。 我试图通过循环调用select在子节点中等待数据到达套接字或读取管道末端来实现此目的。 如果它到达套接字的想法是它写入管道的写端,这导致select返回管道的读端,准备好读取。 由于此管道在所有子项之间共享,因此每个子项应读取管道上的数据。 这不起作用,因为它看起来不是每个子进程同时读取的数据管道以及在调用中“错过”数据块的子进程。 下面是子进程中执行此操作的代码: for( ; ; ) { rset = mset; if(select(maxfd+1, &rset, NULL, NULL, NULL) > 0) { if(FD_ISSET(clientfd, &rset)) { read(clientfd, buf, sizeof(buf)); write(pipes[1], buf, strlen(buf)); } if(FD_ISSET(pipes[0], &rset)) { read(pipes[0], buf, sizeof(buf)); write(clientfd, buf, sizeof(buf)); } } } 我假设我目前使用的方法根本不起作用。 是否可以通过IPC将从客户端收到的消息写入所有其他连接的客户端? 谢谢

c recv()读取直到换行发生

我正在用C编写一个IRC机器人,并遇到了麻烦。 在我的主要function中,我创建了我的套接字并连接,所有这些快乐的东西。 然后我有一个(几乎)无限循环来读取从服务器发回的内容。 然后我将读取的内容传递给辅助函数processLine(char *line) – 问题是,以下代码读取直到我的缓冲区已满 – 我希望它只读取文本直到换行符(\ n)或回车符(\ r)发生(从而结束该行) while (buffer[0] && buffer[1]) { for (i=0;i<BUFSIZE;i++) buffer[i]='\0'; if (recv(sock, buffer, BUFSIZE, 0) == SOCKET_ERROR) processError(); processLine(buffer); } 最终发生的事情是,许多线路都被卡在一起,当发生这种情况时,我无法正确处理线路。 如果您不熟悉IRC协议,可以简要总结一下,当发送消息时,它通常如下所示:YourNickName!YourIdent@YourHostName PRIVMSG #someChannel :The rest on from here is the message sent…例如,登录通知是这样的:the.hostname.of.the.server ### bla some text bla ,###是用于处理的代码(?) – 即372是一个指示符以下文字是每日信息的一部分。 当它全部卡在一起时,我无法读取什么行的数字,因为我找不到行开始或结束的位置! 我非常感谢你的帮助! PS:这是在Linux上编译/运行,但我最终想把它移植到Windows,所以我尽可能多地制作它。 PSS:这是我的processLine()代码: void […]