Tag: 套接字

UDP套接字的发件人IP /端口

是否可以通过C套接字获取发送方IP和(动态获取)端口? 我有以下内容: memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_DGRAM; if ((rv = getaddrinfo(NULL, DATABASEPORT, &hints, &servinfo)) != 0) { fprintf(stderr, “getaddrinfo: %s\n”, gai_strerror(rv)); exit(1); } for(p = servinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { perror(“socket”); continue; } break; } 这几乎是从指南中获取的(虽然我有点得到它?)。 但我无法确定哪些信息可用于查找客户数据。 任何和所有的帮助表示赞赏,谢谢!

在C中通过套接字传输整数

在C中通过套接字传递int的适当方法是什么? 到目前为止我所做的是: int n = 4; int tmp = htonl(n); write(socket, &tmp, sizeof(tmp)); 和 int tmp,n; read(socket, &tmp, sizeof(tmp)); n = ntohl(tmp); 但是,收到的整数有时为0.并非总是如此,但我要说5次中的2次。 它永远不会是其他价值,总是为什么?为什么? 更新:读取的返回值为-1,错误为: Resource temporarily unavailable

从套接字缓冲区逐行读取

好吧,我需要帮助:我想写一个函数,从一个从unistd.h头的read()函数的第三个参数获得的套接字缓冲区中逐行read() 。 我写了这个: int sgetline(int fd, char ** out) { int buf_size = 128; int bytesloaded = 0; char buf[2]; char * buffer = malloc(buf_size); char * newbuf; int size = 0; assert(NULL != buffer); while( read(fd, buf, 1) > 0 ) { strcat(buffer, buf); buf[1] = ‘\0’; bytesloaded += strlen(buf); size = size + […]

在套接字关闭时取消阻止recvfrom

假设我开始在端口上接收线程。 套接字调用将阻止recvfrom。 然后,不知何故在另一个线程中,我关闭套接字。 在Windows上,这将取消阻止recvfrom,我的线程执行将终止。 在Linux上,这不会解锁recvfrom,因此,我的线程永远不会做任何事情,并且线程执行不会终止。 任何人都可以帮助我解决Linux上发生的事情吗? 当套接字关闭时,我希望recvfrom解除阻塞 我一直在阅读有关使用select()的内容,但我不知道如何将它用于我的特定情况。

如何在C中刷新UDP套接字的输入缓冲区?

如何在C中清除UDP套接字的输入缓冲区(如果存在这样的东西)? 我正在使用嵌入式Linux环境并使用C来创建一些本机应用程序。 这些嵌入式计算机中有几台位于同一网络上,当其中一台事件发生时(让我们称之为WHISTLE-BLOWER),WHISTLE-BLOWER应该向网络广播地址发送网络消息,以便所有机器都在网络(包括WHISTLE-BLOWER)知道事件并根据它执行一些操作。 我顺便使用UDP套接字…… 这是它的伪代码: main { startNetworkListenerThread( networkListenerFunction ); while( not received any SIGTERM or such ) { localEventInfo = checkIfTheLocalEventOccured(); broadcastOnNetwork( localEventInfo ); } } networkListenerFunction { bindSocket; while( not SIGTERM ) { // THIS IS WHERE I WANT TO FLUSH THE RECV BUFFER… recv_data = recvfrom( socket ); if( validate recv data […]

是否可以(并且安全)使接受套接字无阻塞?

我正在寻找一种方法来中断阻塞套接字上的accept()调用。 使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。 使用select()是另一种选择,因为各种原因buf在我的情况下不是很吸引人。 如果可能,最好的方法是将套接字设置为非阻塞模式(使用fcntl()和O_NONBLOCK )来自另一个线程,而套接字在accept()调用时被阻塞。 预期的行为是accept()调用将在errno使用EAGAIN或EWOULDBLOCK返回。 它真的会这样吗? 安全吗? 便携式? 如果你知道这个方法对Windows的适用性(你需要使用WSAIoctl()和FONBIO ),我也很感兴趣。

停止在recv上阻塞的接收器线程()

我有一个聊天应用程序,它有一个单独的线程来监听传入的消息。 while (main thread not calling for receiver to quit) { string message = tcpCon.tcpReceive(); // Relies on the recv() function processIncomingMessage(message); } 这种工作方式有一个大问题。 大多数情况下,循环将在recv()上阻塞,因此接收器线程不会退出。 在几秒钟后不强制线程终止的情况下解决此问题的正确方法是什么?

将光标隐藏在远程终端上

我有一个打开远程终端的sockets。 使用“ 强制telnet客户端进入字符模式 ”的答案,我能够将该终端置于字符模式。 我的问题是,如何使用此方法将光标隐藏在远程终端中?

如何干净地中断recv调用中的线程阻塞?

我有一个用C编写的multithreading服务器,每个客户端线程看起来像这样: ssize_t n; struct request request; // Main loop: receive requests from the client and send responses. while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) { // Process request and send response. } if(n == -1) perror(“Error receiving request from client”); else if(n != sizeof(act)) fprintf(stderr, “Error receiving request from client: Incomplete data\n”); […]

是否可以将硬件解复用用于高负载网络服务器?

例如,对于使用TCP / IP的异步IO(使用POSIX轮询/选择或更高级的epoll,kqueue,poll_set,IOCP),网络驱动程序通过不同( 硬件解复用器 )CPU核心的中断启动,接收消息和转储它们是内核级别的单个( 多路复用器 )缓冲区。 然后,我们的线程接受器通过使用epoll / kqueue / poll_set / IOCP从这个单独的缓冲区接收一个消息套接字描述符列表,它们在不同的CPU核心上运行的线程(在线程池中)反复散布( 解复用器 ) 。 简而言之,方案如下:硬件中断( 硬件解复用器 ) – >内核空间中的网络驱动程序( 多路复用器 ) – >用户空间中的用户接受器,使用epoll / kqueue / poll_set / IOCP( 解复用器 ) 是不是更容易,更快,摆脱最后两个链接,并只使用“硬件解复用器”? 一个例子。 如果网络数据包到达,网卡将中断CPU。 在当今的大多数系统中,这些中断分布在核心上。 即这项工作是硬件解复用器。 收到这样的中断后,我们可以立即处理该网络的消息并等待下一个中断。 通过使用CPU中断,所有用于解复用的工作都在硬件级别完成。 在Cortex-A5 MPCore中: http : //infocenter.arm.com/help/index.jsp? topic = / com.arm.doc.ddi0434b / CCHDBEBE.html 在所有Linux中,实时* nix(例如QNX)中是否可行的方法,并且是否存在使用此方法的公共项目,可能是ngnix? 更新: […]