Tag: 套接字

c中的udp聊天服务器

我想用c语言编写udp聊天服务器。 我以前写过tcp聊天服务器,没关系。 在tcp服务器中,accept函数返回一个fd号,服务器根据这个fd号与特定客户端通信。 但是在udp中,我怎么能听一个特定的客户? 在我的tcp服务器中,在客户端连接到服务器之后,创建一个线程并监听该客户端。 因此对于每个客户端,都有一个线程根据从accept函数返回的fd号进行监听。 所以任何消息都可以根据这个fd号发送给特定的客户端。 我怎样才能在udp服务器中实现这一点? 谢谢你的回答。

在C中获取网页最简单的方法是什么?

我正在研究一个旧的学校linux变种(确切地说是QNX)并且需要一种方法来获取网页(没有cookie或登录,目标URL只是一个文本文件),只使用套接字和数组。 有人为此获得了一个片段吗? 注意:我不控制服务器,除了盒子上的内容之外我几乎没有工作(添加额外的库并不是真的“容易”给出约束 – 虽然我喜欢libcurl)

服务器无法正确读取/打开客户端在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 […]

非阻塞TCP套接字处理 – 如何在写入套接字之前检测阻塞状态?

我正在编写一个代理应用程序,它从一个套接字读取并在另一个套接字上写入。 两者都设置为非阻塞,允许处理多个套接字对。 要控制套接字之间的正确流,如果目标套接字上的写入可能会阻塞,则应用程序不应从源套接字读取。 这个想法很好,但是我没有找到目标套接字的阻塞状态而没有先写入它就没有办法……而这并不是我们所需要的。 我知道使用SIOCOUTQ (使用ioctl() )并计算剩余缓冲区的选项,但与简单检查目标套接字是否准备好写入相比,这看起来很难看。 我想我也可以使用select()作为这个套接字,但这是一个如此繁重的系统调用的浪费。

套接字:什么导致read()返回EINVAL?

套接字客户端程序与服务器建立连接,写入一些字节并使用(阻塞) read()等待响应。 但这失败了,错误是EINVAL (“无效参数”)。 以前对socket create() , bind()和connect()的调用已成功完成。 我的问题 这有什么不对? 平台是Linux x64。

在基于epoll的服务器中超时空闲连接

我在c中编写了一个tcp服务器,它使用epoll()i / o多路复用来管理并发连接。 我想超时空闲超过允许时间的连接。 到目前为止,我保留了与每个连接关联的last_active time_t变量,我将其更新为事件处理程序中的当前时间。 在此之前,我检查自上次事件以来是否超过允许的时间,如果是,我终止连接。 到目前为止一切都那么好,但它并不是我想要的,因为超时仅在第一个超时事件中触发,但如果连接保持不活动状态,我的代码在它再次变为“活动”之前不会检测到它。 我在基于select()的服务器中看到这种方式的方法是在事件循环的每次迭代期间线性遍历兴趣集并清除那里的非活动连接。 这在选择中不是问题,因为你已经必须进行此遍历,但我正是使用epoll()来避免必须这样做。 如果我这样做,epoll并不比选择更好。 我也查看了套接字选项,我发现最接近的是SO_RCVTIMEO,这使得read()/ recv()如果等待超过指定时间则返回错误。 但由于我正在使用i / o多路复用并且套接字处于非阻塞模式,因此不会阻塞,因为套接字不会阻塞。 我很感激有关如何解决这个问题的任何见解。 非常感谢你。

如何在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 。

如何将PFS添加到用c和openssl编写的套接字服务器中

我尝试将PFS(完美前向保密)添加到我的客户端 – 服务器应用程序中。 当我使用以下命令运行服务器时: openssl s_server -key ./key.pem -cert ./cert.pem -accept 443 -cipher ECDHE-RSA-AES128-SHA -tls1_2 鉴于以下ctx,我能够与我的客户连接: SSL_CTX* initCTX() { SSL_METHOD *method; SSL_CTX *ctx; SSL_library_init(); OpenSSL_add_all_algorithms(); SSL_load_error_strings(); method = TLSv1_2_client_method(); ctx = SSL_CTX_new(method); if(ctx == NULL) { ERR_print_errors_fp(stderr); return NULL; } SSL_CTX_set_cipher_list(ctx, “ECDHE-RSA-AES128-SHA”); return ctx; } 当我使用以下ctx运行我的服务器应用程序时: SSL_CTX* init_ssl_ctx() { SSL_METHOD const *method; SSL_CTX *ctx; SSL_library_init(); […]

如何将执行命令的结果从服务器发送到客户端?

我正在用C实现一个套接字程序。 节目介绍: 连接服务器和客户端后,客户端向服务器发送命令。 服务器从客户端接收请求并执行它。 服务器将执行结果发送给客户端。 客户端将显示该服务器的执行和显示。 我的问题: 服务器: 我将execvp()函数的结果放入pipe pipefd[1]并使用send()将此数据发送到客户端。 客户: 我收到recv()数据到服务器和显示。 但它不起作用。 我想要的结果: 客户 : ls 服务器: a.txt b.pdf c.jpg 客户: a.txt b.pdf c.jpg 这是我的代码: 服务器: #include #include #include #include #include #include #include #include #define MAXPENDING 5 #define BUFFSIZE 32 #define MAX 128 void Die(char *mess) { perror(mess); exit(1); } void setup(char inputBuffer[], char […]

如何使用RAW套接字嗅探所有ICMP数据包

我正在学习RAW套接字。 在下面的代码中,我试图打印所有ICMP数据包标头信息。 看起来代码中有些错误。 任何人都可以帮助我,我错了。 # include # include # include # include # include # include # include main(){ int sockfd,retval,n; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; char buf[10000]; sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if (sockfd < 0){ perror("sock:"); exit(1); } clilen = sizeof(struct sockaddr_in); while(1){ printf(" before recvfrom\n"); n=recvfrom(sockfd,buf,10000,0,(struct sockaddr *)&cliaddr,&clilen); printf(" rec'd %d […]