1 #pragma comment(lib,"Ws2_32.lib")
2 #include <stdio.h>
3 #include <Winsock2.h>
4 SOCKET sockSrv;//连接所用套节字
5 SOCKET sockConn; //监听套接字
6 SOCKADDR_IN addrSrv;
7 DWORD WINAPI funA(LPVOID lp);
8 //定义发送和接收的缓存数组
9 char sendBuf[50];
10 char recvBuf[50];
11
12 void main(){
13 //要求使用的版本
14 WORD wVersionRequested;
15 //
16 WSADATA wsaData;
17 int err;
18
19 wVersionRequested = MAKEWORD(1,1);
20 //初始化WinSock dll库 WSAStartup 函数返回0表示初始化成功
21 err = WSAStartup(wVersionRequested,&wsaData);
22 //测试版本获取结果
23 //printf("%d\n",err);
24 if(err!=0){
25 printf("WinSock初始化失败\n");
26 return;
27
28 }
29
30 if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){
31 WSACleanup();
32 return;
33 }
34 printf("服务器已启动......\n");
35
36 //创建Socket套接字
37 sockSrv = socket(AF_INET,SOCK_STREAM,0);
38 //通讯的IP地址 htonl把主机字节转换成网络字节
39 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
40 //使用IP地址族
41 addrSrv.sin_family=AF_INET;
42 //通讯的端口号
43 addrSrv.sin_port=htons(8888);
44 //函数绑定 将套接字与通讯地址建立联系
45 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
46 //建立监听队列(把套接字转换成监听模式)
47 listen(sockSrv,5);
48 int len=sizeof(SOCKADDR);
49
50 //accept接受客户请求
51 sockConn = accept(sockSrv,(SOCKADDR*)&addrSrv,&len);
52
53 sprintf(sendBuf,"服务器IP: %s ;连接成功!",inet_ntoa(addrSrv.sin_addr));
54 //发送消息
55 send(sockConn,sendBuf,strlen(sendBuf)+1,0);
56
57 HANDLE a;
58 DWORD dwT;
59
60 //参数1:使用默认的安全性;参数2:与调用线程一样的栈大小;
61 //参数3:线程入口函数地址;参数4:传递给线程的参数;参数5:线程创建标记;参数6:新线程的ID
62 a=CreateThread(NULL,0,funA,0,0,&dwT);
63 CloseHandle(a);
64
65 //消息循环接收和发送
66 while(1){
67 //从控制台接收用户输入
68 //printf("服务器说:");
69 scanf("%s",sendBuf);
70 //发送消息到客户端
71 send(sockConn,sendBuf,strlen(sendBuf)+1,0);
72 }
73 closesocket(sockConn);
74 //关闭连接和套接字
75 WSACleanup();
76 }
77
78 DWORD WINAPI funA(LPVOID lp)
79 {
80 while(1){
81 //从服务器接收数据显示到控制台
82 if(recv(sockConn,recvBuf,50,0) != -1){
83 printf("客户端说:%s\n",recvBuf);
84 }else{
85 printf("连接已经中断.....请检查客户端是否连接并重试。");
86 system("pause");
87 exit(0);
88 }
89 }
90 return 0;
91 }