Trong mã khách hàng của tôi, tôi đang làm theo các bước sau để kết nối với một ổ cắm:Tái sử dụng mô tả ổ cắm trên kết nối thất bại
Tạo cổng
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Connecting nó (thử lại cho 'x 'thời gian trong trường hợp thất bại)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
(Sau khi điền
destAddr
trường)Sử dụng ổ cắm cho
send()
/recv()
hoạt động:send(sockDesc, buffer, bufferLen, 0) recv(sockDesc, buffer, bufferLen, 0)
close()
mô tả ổ cắm và thoátclose(sockDesc)
Nếu trong quá trình send()
/recv()
ngắt kết nối, tôi thấy rằng Tôi có thể kết nối bằng cách quay lại bước 2.
Giải pháp này có được không? Tôi có nên đóng bộ mô tả socket và quay lại bước 1 không?
Một quan sát thú vị khác mà tôi không thể hiểu là khi Tôi dừng máy chủ echo và khởi động máy khách. Tôi tạo ra một Socket (bước 1) và gọi connect()
mà không thành công (như mong đợi) nhưng sau đó tôi tiếp tục gọi connect()
, cho phép nói, 10 lần. Sau 5 lần thử lại, tôi khởi động máy chủ và connect()
thành công. Nhưng trong khi gọi send()
cuộc gọi sẽ nhận được lỗi SIGPIPE
. Tôi muốn biết:
1) Tôi có cần tạo ổ cắm mới mỗi lần connect()
không thành công? Theo sự hiểu biết của tôi miễn là tôi chưa thực hiện bất kỳ send()
/recv()
nào trên ổ cắm, nó cũng tốt như mới và tôi có thể sử dụng lại cùng một số fd
cho cuộc gọi connect()
.
2) Tôi không hiểu tại sao SIGPIPE
được nhận khi máy chủ kết thúc và connect()
thành công.
Sau khi thay đổi mã như đề xuất đóng bộ mô tả scoket và tạo ổ cắm mới và kết nối nó, vấn đề SIGPIPE không còn xảy ra nữa. – Adil
Tôi thấy liên kết này hữu ích và có liên quan đến câu hỏi của bạn khi bạn sử dụng gửi thay vì viết: http://stackoverflow.com/questions/9048959/write-and-send-solving-errors-difference –