gpt4 book ai didi

c - C中udp套接字上的poll()POLLIN事件

转载 作者:行者123 更新时间:2023-12-03 12:02:44 38 4
gpt4 key购买 nike

我正在尝试通过轮询实现UDP-UART桥。该程序工作正常,但我认为当我收到某些东西时会触发POLLIN事件,但是当我发送某些东西时也会触发...

        fds[0].fd = port; // configure fdset 0 on uart 
fds[0].events = POLLIN ; // we are interested by POLLIN events type

fds[1].fd = socket; // configure fdset 1 on udp socket
fds[1].events = POLLIN ; // we are interested by POLLIN events type

while(1) // main process loop
{
ret = poll(fds,2, timeout_msecs); // check the two fds for events (uart & socket)
if (ret > 0) { // if there is an event

if (fds[1].revents & POLLIN) // if the event is an input on socket fds[1]
{
sock_length = recvfrom(socket,&sock_buff,sizeof(sock_buff),MSG_WAITALL, (struct sockaddr *) &servaddr, &fromlen); //receive from socket and store tosock_buff

write(port,sock_buff,sock_length); // send back sock_buff content through uart





}



if (fds[0].revents & POLLIN) // if the event is an input on uart fds[0]
{
ser_length = read(port, ser_buff, sizeof(ser_buff) ); //read the uart and store to serbuff

sendto(socket,ser_buff,ser_length,MSG_CONFIRM, (const struct sockaddr *) &servaddr,sizeof(servaddr)); //send the serial buffer via udp socket





}


}
else // if nothing append before "timeout_msecs" milliseconds (5000)
{
printf("timeout \n");


}

在我的代码中,我遇到的问题如下:
假设我在uart端有一些东西,例如“hello server”,然后我使用sendto通过套接字发送字符串。但我认为它会触发套接字上的POLLIN事件。因此它将在uart中写回我刚刚像回声一样发送的数据...

当我发送“hello服务器”时,我想回到uart中服务器“hello客户端”的答案

但是当前我得到了“hello server hello client”,因为套接字POLLIN事件两次触发,当我发送时,当服务器应答时

有没有一种方法可以防止在我使用“sendto”时触发POLLIN?

最好的祝福,

皮埃尔。

编辑:套接字以这种方式初始化:
struct sockaddr_in servaddr;

int open_connection(char * IPaddr,unsigned int port)
{
int sockfd = 0;
if (( sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )
{
perror("socket creation failed");
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
// Filling server information
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = inet_addr(IPaddr);

return sockfd;

}

最佳答案

我终于解决了我的问题。它与udp套接字和poll()都不相关。

实际上,当您在Unix下配置uart时,必须显式阻止echo输入参数。

config.c_lflag &= ~(ECHO | ECHOE | ISIG); // disable echo et signals

如果不这样做,本地uart回显将发送回您的数据。

抱歉浪费您的时间。

问候,

皮埃尔。

关于c - C中udp套接字上的poll()POLLIN事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61874514/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com