WinSocket聊天程序实例(多线程)

 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 } 

 

posted @ 2014-02-27 09:27  沽名钓誉  阅读(530)  评论(0编辑  收藏  举报