2011-01-06 37 views
5

Tôi có một chương trình thực hiện một số kết nối mạng bằng Winsock và một trong các yêu cầu của chúng tôi hiện nay là chuyển sang chương trình của chúng tôi sang Linux. Điều duy nhất ngăn chúng tôi làm điều này là Winsock.Chuyển Winsock sang Ổ cắm Linux

Câu hỏi của tôi là: Tôi có thể chuyển sang cài đặt Linux dễ dàng như thế nào?

Có bất kỳ cạm bẫy nào tôi cần phải biết và nếu tôi chỉ bao gồm các tệp tiêu đề thích hợp, tôi sẽ phải xử lý những thứ gì?

Cảm ơn bạn đã trợ giúp!

Tôi muốn đăng mã nhưng tôi không may là do các lý do pháp lý. Tuy nhiên, mã của chúng tôi sử dụng các mục sau:

WSAStartup(..) 
WSACleanup(..) 
Socket(..) 
sendto(..) 
recvfrom(..) 
ioctlsocket(..) 
setsocketopt(..) 

Trả lời

6

Nó sẽ phụ thuộc nếu bạn sử dụng bất kỳ chức năng mạng cụ thể nào của cửa sổ hoặc nếu bạn chỉ sử dụng hầu hết API tương thích BSD. Vì vậy, nếu bạn đang sử dụng các cổng kết thúc I/O và I/O chồng lên nhau và các phần nâng cao khác của API Winsock thì mọi thứ sẽ rất khó để chuyển và nếu bạn chỉ sử dụng công cụ tương thích BSD thì nó nên dễ viết một lớp dịch mỏng hoặc thậm chí chỉ có khởi động winsock và các công cụ tắt máy bên trong một cửa sổ ifdef cụ thể ...

này có thể giúp: http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html

0

Không thấy mã, thật khó để nói nó dễ đến mức nào. Nhưng bạn nên có thể thay thế các cuộc gọi winsock thành các chất tương tự trong sys/sockets.h.

3

Các cuộc gọi duy nhất làm cho việc chuyển vùng khó khăn là các cuộc gọi WSA *.

WSAStartup() -> nop WSACleanup() -> nop

Socket/setsockopt -> ổ cắm/setsockopt

Dưới * nix, ổ cắm đang chặn theo mặc định và nó không cần thiết hoặc có thể sử dụng mà gọi setockopt lạ để fiddle với nó.

ioctlsocket -> ioctl

Dưới * nix chúng ta không thích socket không đồng bộ nhiều và thích sử dụng các lựa chọn() gọi hệ thống.

---- Phần còn lại của câu trả lời này dường như chỉ để áp dụng cho Win95 winsock tương thích ----

WSASocket Thật không may là các ổ cắm gốc() trong Winsock bị hỏng trong một số trường hợp, bạn có thể sử dụng() và vì vậy phải chuyển đổi các cuộc gọi đó.

+0

Mã của chúng tôi sử dụng socket(), tôi đã đăng các chức năng được sử dụng trong mã, vì tôi không thể đăng mã thực tế. –

+0

không thể làm nổi bật bằng cách chặn? [Có thể thực hiện không chặn I/O trên ổ cắm bằng cách đặt cờ O_NONBLOCK trên bộ mô tả tệp socket bằng fcntl (2).] (Http://linux.die.net/man/7/socket) Bạn ' mặc dù nó là một hàm khác, không phải 'setsockopt'. –

+0

Ben Voigt: chính xác. Các cửa sổ setsockopt gọi được gọi là trên xử lý NULL và thiết lập chế độ cho tất cả các ổ cắm mới. – Joshua

8

trên cơ sở đó danh sách các chức năng, mọi thứ nên nhiều hoặc ít hoạt động hơn. Thêm #if _WIN32 xung quanh các cuộc gọi đến WSAStartupWSACleanup (tương đương với Linux là không làm bất cứ điều gì, thư viện ổ cắm được khởi tạo tự động).

Bạn cũng có thể cần một số mã phụ thuộc vào hệ điều hành khi đặt tùy chọn ổ cắm, một số trong số đó giống nhau, một số thì không và các loại có thể khác nhau.

Các vấn đề liên quan