可算Windows完成端口服務器端最簡單的例子了,看看吧。
//服務器端在端口555上監聽,將連接發送來的訊息保存至cBuf數組中,然後關閉連接,退出程序。
#include
<
windows.h
>
#include
<
stdio.h
>
#include
<
stdlib.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#pragma
comment (lib, "WS2_32.lib")
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
DEFAULT_PORT 555
#define
DEFAULT_BUFFER 8
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
main(
void
)
...
{
//初始化
WSADATA wsd;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(WSAStartup(MAKEWORD(2, 2), &wsd) != 0)...{
printf("WSAStartup error! ");
return FALSE;
}
printf("WSAStartup初始化成功! ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
SOCKET sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(sSocket == SOCKET_ERROR)...{
printf("SOCKET ERROR! ");
return FALSE;
}
printf("socket初始化成功! ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
struct sockaddr_in local;
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);
//綁定
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(bind(sSocket, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)...{
printf("綁定失敗!bind error! ");
return FALSE;
}
printf("綁定成功! ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//監聽
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(listen(sSocket, 10) == SOCKET_ERROR)...{
printf("監聽失敗!listen error! ");
return FALSE;
}
printf("監聽成功! ");
printf("開始監聽... ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
int naddrlen = sizeof(struct sockaddr_in);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//創建完成端口
HANDLE hIocp;
hIocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
NULL, 0, 0);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (hIocp == NULL)...{
printf("完成端口創建失敗! ");
return FALSE;
}
printf("完成端口創建成功! ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//套接字與完成端口關聯
if(CreateIoCompletionPort((HANDLE)sSocket,
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
hIocp, (ULONG)0, (ULONG)0) == NULL)...{
printf("完成端口綁定失敗! ");
}
printf("完成端口成功綁定! ");
//接受連接
SOCKET sClient = accept(sSocket, (struct sockaddr *)&local, (int *)&naddrlen);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(sClient == SOCKET_ERROR)...{
printf("接受連接失敗!accept error! ");
return FALSE;
}
printf("接受連接成功! ");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
HANDLE hWorkThread = CreateThread(NULL, 0, WorkThread, (void*)sClient, 0, &dwTreadId);
CloseHandle(hWorkThread);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
char cBuf[DEFAULT_BUFFER] = ...{'
客戶端可以先telnet上去看看,比如運行
telnet 127.0.0.1 555
看看發生了什麽~~
(其客戶端參見“視窗:網路-(完成端口)-最簡示例(客戶端) ”)