TCP单线程服务端
1 #include <WINSOCK2.H>
2 #include <iostream>
3 #pragma comment(lib, "WS2_32")
4
5
6 UINT SrvThread(LPVOID pParam)
7 {
8 // SOCKET实际上是一个unsigned int类型
9 SOCKET server;
10 // WSADATA结构将有WSAStartup函数来填充
11 WSADATA wsaData;
12 // 对TCP/IP 套接字来说,sockaddr_in结构指定了套接字的地址
13 // 其他协议使用相似的结构
14 sockaddr_in local;
15 // WSAStartup函数负责加载Winsock库的函数
16 // 第一个参数用来指定想要加载的Winsock库的版本
17 int wsaret=WSAStartup(0x101,&wsaData);
18 // 调用成功,WSAStartup函数返回0
19 // 失败的话,程序就退出
20 if(wsaret!=0)
21 {
22 return 0;
23 }
24 // 现在我们填充sockaddr_in结构
25 local.sin_family=AF_INET; // 地址家族Address family
26 local.sin_addr.s_addr=INADDR_ANY; // 要求使用当前主机配置的所有IP地址
27 local.sin_port=htons((u_short)20248); // 使用的端口
28 // socket函数用来创建我们的SOCKET
29 server=socket(AF_INET,SOCK_STREAM,0);
30 // 如果socket()函数调失败,我们退出
31 if(server==INVALID_SOCKET)
32 {
33 return 0;
34 }
35 // 为套接字关联本地地址的函数是bind.
36 // bind函数用在没有建立连接的套接字上,它的作用是绑定面向连接的或者无连接的套接字。
37 // 套接字被socket函数创建以后,存在于指定的地址家族里,但它是未命名的。
38 // bind函数通过安排一个本地名称到未命名的socket建立此socket的本地关联。
39 // 本地名称包含3个部分:主机地址、协议号(分别为UDP或TCP)和端口号。
40 if(bind(server,(sockaddr*)&local,sizeof(local))!=0)
41 {
42 return 0;
43 }
44 // listen函数设置套接字进入监听状态
45 // 为了接受连接,首先使用socket函数创建一个套接字,然后使用bind函数将它绑定到一个本地地址,
46 // 再用listen函数为到达的连接指定一个backlog,最后使用accept接受请求的连接。
47 // 函数的第二个参数是backlog值
48 if(listen(server,10)!=0)
49 {
50 return 0;
51 }
52 // 我们需要变量在保存客户套接字,下面是这些变量的定义
53 SOCKET client;
54 sockaddr_in from;
55 int fromlen=sizeof(from);
56 // 下面进入无限循环
57 while(true)
58 {
59 char temp[512];
60 // accept() 将接受到了的客户连接
61 client=accept(server,(struct sockaddr*)&from,&fromlen);
62 sprintf(temp,"Your IP is %s\r\n",inet_ntoa(from.sin_addr));
63 // 我们简单的将这串字符发送给客户
64 send(client,temp,strlen(temp),0);
65 cout << "Connection from " << inet_ntoa(from.sin_addr) <<"\r\n";
66 // 关闭客户套接字
67 closesocket(client);
68 }
69 // closesocket()关闭套接字,并且释放套接字描述表
70 closesocket(server);
71 // 每一个对WSAStartup的调用必须对应一个对WSACleanup的调用,这个函数释放Winsock库
72 WSACleanup();
73 return 0;
74 }
75
76 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
77 {
78 int nRetCode = 0;
79 cout << "Press ESCAPE to terminate program\r\n";
80 AfxBeginThread(SrvThread,0);
81 while(_getch()!=27);
82 return nRetCode;
83 }
posted on 2011-12-22 22:05 Sunny_NUAA 阅读(469) 评论(0) 编辑 收藏 举报