Tag: 套接字

非阻塞连接OpenSSL

我创建了一个普通的C套接字。 在连接时,它按预期返回EWOULDBLOCK/WSAEWOULDBLOCK ,因为我做了: unsigned long int mode = 0; ioctlsocket(ssl_info->sock, FIONBIO, &mode); setsockopt(ssl_info->sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(tv)); setsockopt(ssl_info->sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv, sizeof(tv)); 将套接字置于非阻塞模式。 之后我做了: ssl = SSL_new(ctx); SSL_set_fd(ssl, sock); return SSL_connect(ssl); 但是,它返回-1。 我在网上看到,这意味着我需要处理SSL_ERROR_WANT_READ和SSL_ERROR_WANT_WRITE 。 所以我做了: int res = -1; while(res == -1) { res = SSL_connect(ssl); switch (SSL_get_error(ssl, res)) { case SSL_ERROR_WANT_CONNECT: MessageBox(NULL, “Connect Error”, […]

如何“杀死”Pthread?

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

套接字中的网络字节顺序

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

非阻塞套接字在C中没有自旋锁接受

可能重复: 唤醒线程在accept()调用时被阻塞 我正在编写一个小型服务器,它监听连接(接受它们并将它们传递给工作线程),直到发送自定义停止信号。 如果我使用阻塞套接字,那么我的主接受循环不会破坏正在发送的自定义停止信号。 但是,我希望避免使用带有非阻塞套接字的busy-wait / spinlock循环。 我想要的是我的主接受循环阻止,直到收到连接或发送停止信号。 这可能在Linux上的C? 非常感谢。

C – 使用poll在socket(s)和stdin之间进行多路复用 – 服务器

我正在编写一个客户端服务器应用程序,我正在使用poll来在多个客户端套接字和stdin之间进行多路复用,我可以在其中插入命令(例如:停止服务器)。 我相信我的代码的结构(“逻辑”)是正确的,但它的行为并不像我期望的那样: struct pollfd pfd[NSERVER]; //defined as 10 pfd[0].fd = fileno(stdin); pfd[0].events = POLLIN; pfd[1].fd = socktfd; //server bind, listen socket pfd[1].events = POLLIN; struct sockaddr_storage remoteaddr; // client address socklen_t addrlen; char remoteIP[INET6_ADDRSTRLEN]; addrlen = sizeof remoteaddr; char buf[1024]; // buffer int pos=2; while(poll(pfd,1,0) >= 0) { if(pfd[0].revents & POLLIN) { //stdin //process input […]

在不同的机器上运行UDP客户端和服务器

我在同一台计算机上运行时有一个UDP客户端和运行正常的服务器。 (这里为客户端我已经将127.0.0.1作为UDP客户端上的目标IP)。 但是,当在不同的机器上运行,并用我的server.c所在机器的ip替换127.0.0.1时,该程序不起作用。 问题是我没有收到任何错误消息。 以下是服务器和客户端的代码。 请告诉我在不同的机器上运行相同的任何修改(我使用的是LINUX OS)。 注意:我的机器服务器IP (存在server.c的机器): 10.60.5.945 , clientIP:10.60.5.950 server.c: #include #include #include #include #include #include #include #include int main() { int cont,create_socket,new_socket,addrlen,fd; int bufsize = 1024; int nameLen=0; int client_address_size=0; char *buffer = malloc(10); char fname[256]; struct sockaddr_in address,client; if ((create_socket = socket(AF_INET,SOCK_DGRAM,0)) > 0) printf(“The socket was created\n”); address.sin_family = […]

使用fork和dup的简单http通用服务器

我正在尝试编写一个非常基本的HTTP服务器。 我想将服务器和服务分成两个单独的可执行文件(类似于inetd)。 所以我有一个通用服务器,它使用exec分叉服务并执行其代码。 主循环如下: while(true) { int client_sock; if ((client_sock = accept(server_sock, (struct sockaddr *) NULL, NULL)) < 0) { return -1; } pid_t pid = fork(); if (pid == 0) { close(server_sock); close(0); dup(client_sock); close(1); dup(client_sock); execvp(argv[2], argv+2); return -1; } else if (pid < 0) { assert(false); } close(client_sock); } 该服务读取stdin,并在stdout上写入并处理简单的http请求。 当我使用nc连接到我的服务器时,一切似乎都工作正常。 nc接收并显示预期的http回复。 […]

查找UDP数据包的源IP /进程

我在我的C程序中使用recvfrom()来接收来自多个客户端的UDP数据包,这些客户端可以使用自定义用户名登录。 一旦他们登录,我希望他们的用户名与唯一的客户端进程配对,这样服务器就会自动知道用户的来源。 如何从recvfrom()收到的数据包中获取此信息?

C pthreads在套接字上发送()ing和recv()。 分开工作但不在一起工作。 不会退出

为了消除我对C知识的渴望,在连接到我的家庭网络的两个linux盒子上,我正在写一个send() s和recv() s字符串的骨架telnet(仅用于一些套接字和线程的经验) 。 服务器侦听并且客户端连接并从stdin发送字符串。 我得到了那些工作然后我改变它们来实现pthreads和线程版本工作。 最后,我把两者放在一个程序中,这样连接的任何一端都可以(理论上)发送和接收字符串。 客户端和服务器都使用strstr()来监视”quit”然后退出。 正如这篇文章的标题所暗示的那样,当我把它们放在一起时,组合版本将发送字符串但它不会在它应该的时候退出。 我不确定出了什么问题。 我尝试用gdb逐步完成它,但我对gdb太缺乏经验,无法分辨出发生了什么。 那么,为什么不退出呢? 为了退一步,有没有更好的方法来实现我想要做的事情? 谢谢你的帮助。 clientserver.c #include #include #include #include #include #include #include #include #include #include #include int sockfd = 0, send_running = 1, recv_running = 1, status = 0, acptsockfd = 0; char str_to_send[200], str_rcvd[200]; char *remote_host_addr_str = NULL; struct sockaddr_in remote_addr, listening_addr; void *sender(void […]

用于TFTP的C超时实现

我试图在我的TFTP实现中实现超时机制,我正在寻找一些一般的帮助。 我想知道的是如何管理超时情况。 我使用的过早超时机制是信号/报警function,但不知怎的,我陷入了如何处理我的超时,即如果丢失数据包(ack或数据)并且发生超时如何发回以前的数据包或确认服务器。