0
我有下面的代碼實現一個非阻塞TCP接受器。客戶端能夠連接,沒有任何問題,寫作似乎也發生,但接受者不會從套接字讀取任何內容,並且無限期地調用read()
塊。 我接受者使用了一些錯誤的設置嗎?非阻塞TCP-接收器沒有從套接字讀取
親切的問候 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;
}
我用額外的日誌記錄/ printf跟蹤代碼(這裏沒有顯示) –
爲什麼你忽略所有的返回值和條件指示符? – EJP