gpt4 book ai didi

c - 非阻塞 TCP 接受器不从套接字读取

转载 作者:太空宇宙 更新时间:2023-11-04 07:33:26 24 4
gpt4 key购买 nike

我有下面的代码实现了一个非阻塞 TCP 接受器。客户端能够毫无问题地连接并且写入似乎也在发生,但是接受器不会从套接字中读取任何内容并且对 read() 的调用无限期地阻塞。我是否对接受器使用了错误的设置?

亲切的问候AFG

int main(){
create_programming_socket();
poll_programming_connect();
while(1){
poll_programming_read();
}
}


int create_programming_socket(){
int cnt = 0;
p_listen_socket = socket( AF_INET, SOCK_STREAM, 0 );
if( p_listen_socket < 0 ){
return 1;
}

int flags = fcntl( p_listen_socket, F_GETFL, 0 );
if( fcntl( p_listen_socket, F_SETFL, flags | O_NONBLOCK ) == -1 ){
return 1;
}

bzero( (char*)&p_serv_addr, sizeof(p_serv_addr) );

p_serv_addr.sin_family = AF_INET;
p_serv_addr.sin_addr.s_addr = INADDR_ANY;
p_serv_addr.sin_port = htons( p_port );

if( bind( p_listen_socket, (struct sockaddr*)&p_serv_addr
, sizeof(p_serv_addr) ) < 0 ) {
return 1;
}
listen( p_listen_socket, 5 );
return 0;
}


int poll_programming_connect(){
int retval = 0;
static socklen_t p_clilen = sizeof(p_cli_addr);
int res = accept( p_listen_socket, (struct sockaddr*)&p_cli_addr, &p_clilen );
if( res > 0 ){
p_conn_socket = res;
int flags = fcntl( p_conn_socket, F_GETFL, 0 );
if( fcntl( p_conn_socket, F_SETFL, flags | O_NONBLOCK ) == -1 ){
retval = 1;
}else{
p_connected = true;
}
}else if( res == -1 && ( errno == EWOULDBLOCK || errno == EAGAIN ) ) {
//printf( "poll_sock(): accept(c_listen_socket) would block\n");
}else{
retval = 1;
}
return retval;
}

int poll_programming_read(){
int retval = 0;
bzero( p_buffer, 256 );
int numbytes = read( p_conn_socket, p_buffer, 255 );
if( numbytes > 0 ) {
fprintf( stderr, "poll_sock(): read() read %d bytes\n", numbytes );
int fred;
int i;
} else if( numbytes == -1 && ( errno == EWOULDBLOCK || errno == EAGAIN ) ) {
//printf( "poll_sock(): read() would block\n");
} else {
close( p_conn_socket );
p_connected = false;
retval = 1;
}
return retval;
}

最佳答案

poll_programming_connect 的调用在您的 while 循环之外 - 因此它很可能不接受连接(因 EWOULDBLOCK 而失败)。因此,您没有可读取的有效套接字。

在调用 poll_programming_read 之前,您需要等到建立连接。

关于c - 非阻塞 TCP 接受器不从套接字读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11186328/

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