當我呼叫從客戶端-> 服務器發送的函式時,我收到有關客戶端重置連接的客戶端代碼錯誤。我在互聯網上查看過,但我沒有完全理解它,有人可以解釋是什么觸發了這個錯誤,為什么?
這是客戶端套接字的代碼。我讓它接受 127.0.0.1 上的服務器。
客戶端.C
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#define SERVER_PORT 9002
#define BUFSIZE 4096
#define SOCKETERROR (-1)
#define SERVER_BACKLOG 1
typedef struct sockaddr_in SA_IN;
typedef struct sockaddr SA;
struct sockaddr_in init_socket(const char* address);
void check(int output,const char* msg);
int main(int argc,char** argv){
int number = 0;
int client_socket;
SA_IN client_address;
check((client_socket = socket(AF_INET,SOCK_STREAM,0)),"[SERVER] : cannot create socket");
client_address = init_socket("127.0.0.1");
check(connect(client_socket,(struct sockaddr*)&client_address,sizeof(client_address)),"[CLIENT]--(connect)--->[SERVER] ");
while(1){
if(send(client_socket,&number,sizeof(number),0),"[CLIENT]-------->[SERVER] " > 0){
number ;
if(number == 100) break;
printf("[CLIENT] : %d\n",number);
check(recv(client_socket,&number,sizeof(int),0),"[CLIENT]-------->[SERVER] ");
}
}
close(client_socket);
return 0;
}
struct sockaddr_in init_socket(const char* address){
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(SERVER_PORT);
// server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_addr.s_addr = inet_addr(address);
return server_address;
}
void check(int output,const char* msg){
if(output < 0){
perror(msg);
exit(1);
}
}
這是服務器套接字的代碼。它接受來自任何地址(INADDR_ANY)的客戶端。
服務器.C
#define _GNU_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#define SERVER_PORT 9002
#define BUFSIZE 4096
#define SOCKETERROR (-1)
#define SERVER_BACKLOG 1
typedef struct sockaddr_in SA_IN;
typedef struct sockaddr SA;
void handle_connection(int client_socket);
struct sockaddr_in init_socket();
void check(int output,const char* msg);
int main(int argc,char** argv){
int number;
int server_socket , client_socket;
SA_IN server_address ,client_address;
check((server_socket = socket(AF_INET,SOCK_STREAM,0)),"[SERVER] : cannot create socket");
server_address = init_socket();
check(bind(server_socket,(SA*)&server_address,sizeof(server_address)),"[SERVER] : binding error");
check((client_socket = listen(server_socket,SERVER_BACKLOG)),"[SERVER] : listen failed");
while(1){
if(recv(client_socket,&number,sizeof(int),0) > 0){
number ;
if(number == 100) break;
printf("[SERVER] : %d\n",number);
check(send(client_socket,&number,sizeof(number),0),"[SERVER]-------->[CLIENT]: ERROR");
}
}
close(server_socket);
return 0;
}
struct sockaddr_in init_socket(){
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(SERVER_PORT);
server_address.sin_addr.s_addr = INADDR_ANY;
return server_address;
}
void check(int output,const char* msg){
if(output < 0){
fprintf(stderr,"%s\n",msg);
exit(1);
}
}
uj5u.com熱心網友回復:
“對等方重置連接”正是它聽起來的樣子:“對等方”(連接的另一端)已經關閉了連接。
通常,您通過檢查套接字是否可讀以及read(或recv)回傳來發現它0。
如果您沒有以這種方式檢測到它,而是嘗試寫入套接字,您將收到您遇到的錯誤。
如果您收到該錯誤(或以其他方式檢測到關閉的連接),那么您應該關閉連接的一端。
您的代碼的具體問題是您的check函式只檢查錯誤,而不是可能適用的其他條件(如關閉的連接)。
將什么read或recv回傳值保存在一個變數中幾乎總是一個好主意,您可以檢查顯式錯誤 ( -1) 或關閉的連接 ( 0) 或成功接收的資料 ( > 0)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/476508.html
