IOCP以及扩展Windows socket函数应用示例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows和Linux中,socket编程的基本概念和API是相同的,但是在实现上有一些区别。 首先,Windows和Linux的socket API是不同的,因此在编写代码时需要使用不同的函数和数据结构。例如,在Windows中,使用的是Winsock API,而在Linux中,使用的是BSD socket API。 其次,Windows和Linux的socket实现方式也有所不同。在Windows中,socket实现是基于IOCP(I/O Completion Ports)的,而在Linux中,socket实现是基于文件描述符的。 最后,Windows和Linux的socket编程还有一些细节上的差异,例如在Windows中需要调用WSAStartup函数来初始化Winsock库,而在Linux中则不需要。 下面是一个简单的示例代码,演示了如何在Windows和Linux中创建一个TCP套接字并进行连接: Windows: ``` #include <winsock2.h> #include <ws2tcpip.h> int main() { WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != 0) { printf("WSAStartup failed: %d\n", iResult); return 1; } SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo* result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; iResult = getaddrinfo("www.example.com", "http", &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; } for (ptr = result; ptr != NULL; ptr = ptr->ai_next) { ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { printf("socket failed: %ld\n", WSAGetLastError()); WSACleanup(); return 1; } iResult = connect(ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen); if (iResult == SOCKET_ERROR) { closesocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } break; } freeaddrinfo(result); if (ConnectSocket == INVALID_SOCKET) { printf("Unable to connect to server!\n"); WSACleanup(); return 1; } // Do something with the connected socket... closesocket(ConnectSocket); WSACleanup(); return 0; } ``` Linux: ``` #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <unistd.h> int main() { int sockfd, status; struct addrinfo hints, *res; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; status = getaddrinfo("www.example.com", "http", &hints, &res); if (status != 0) { fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status)); return 1; } sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sockfd == -1) { perror("socket"); return 1; } status = connect(sockfd, res->ai_addr, res->ai_addrlen); if (status == -1) { perror("connect"); close(sockfd); return 1; } // Do something with the connected socket... close(sockfd); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值