2011-10-15 13 views
7

tôi đã mô tả cho một socket TCP theo cách thức sau đây:Có thể mô tả các ổ cắm được chuyển đổi thành File Pointers không?

int desc = accept(socket_descriptor, &client_address, &len)

Bây giờ từ mô tả này desc Tôi muốn có được một con trỏ tập tin. Có thể sử dụng fdopen() ở đây không?

Lý do tôi muốn lấy con trỏ tệp là vì tôi đang thực hiện thay đổi đối với mã hiện có ghi dữ liệu vào tệp cục bộ. Bây giờ, tôi muốn mở rộng chức năng của nó để nó có thể luân phiên viết cho một máy khách TCP. Tôi không muốn viết lại tất cả các chức năng và đang nghĩ đến việc bằng cách nào đó có thể sử dụng cơ sở hạ tầng hiện có. Các chức năng hiện có sử dụng con trỏ tập tin để ghi vào tập tin. Tôi đã tự hỏi nếu nó có thể làm cho cùng một chức năng ghi vào một dòng TCP mà không thực hiện bất kỳ thay đổi.

Trả lời

8

Có, fdopen() chính xác là những gì bạn cần. Dưới đây là những gì man page đang nói về nó:

Các fdopen() chức năng liên kết một dòng với mô tả tập tin hiện có, fd. Chế độ của luồng (một trong các giá trị "r", "r +", "w", "w +", "a", "a +") phải tương thích với chế độ của tệp mô tả. Chỉ báo vị trí tệp của luồng mới được đặt thành thuộc về fd và các chỉ báo lỗi và kết thúc tệp được xóa . Các chế độ "w" hoặc "w +" không gây cắt xén tệp. Trình mô tả tệp không bị lừa đảo và sẽ bị đóng khi luồng được tạo bởi fdopen() bị đóng. Kết quả của việc áp dụng fdopen() cho một đối tượng bộ nhớ chia sẻ là không xác định.

Nhưng hãy thận trọng khi áp dụng cho bộ mô tả ổ cắm. Các hàm I/O cấp cao sử dụng bộ đệm và có thể gửi dữ liệu khác nhau (tức là mỗi lần xuất hiện \n trong luồng, chèn \r) v.v.

+1

Hầu hết các tệp không được xếp vào bộ đệm, chỉ 'stdout'. Tôi không chắc chắn nếu có một cách để thiết lập một tập tin được dòng đệm, nhưng tôi tin rằng hầu hết sẽ được khối đệm, mà nên được một chút thân thiện hơn socket. –

+0

@ChrisLutz: Hàm này là 'setlinebuf'. Tôi nghĩ rằng 'stdout' chỉ là dòng đệm nếu nó nối với một thiết bị đầu cuối, nhưng tôi không chắc chắn. –

+0

@DietrichEpp - Cảm ơn bạn. Và tôi nghĩ bạn đúng về 'stdout'. –