搜索
查看: 1668|回复: 9
打印 上一主题 下一主题

自己写聊天工具..

[复制链接]
跳转到指定楼层
楼主
发表于 2014-3-25 23:02:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
套接字编程了解下就可以了!使用的时候拷贝下来使用!还有这个是在我本机测试是!在两台电脑测试的话改IP地址就好了!服务器端代码
  1. #include <Winsock2.h>//套接字需要的头文件
  2. #include <stdio.h>
  3. #pragma comment(lib,"ws2_32.lib")        //添加预处理文件#pragmacomment(lib,"ws2_32.lib")
  4. void main()
  5. {       

  6.         //WSAStartup函数 用处加载套接字winsokeDLL,套接字版本.失败返回0
  7.         WORD wVersionRequested;//定义一个WORD类型变量.
  8.         WSADATA wsaData;//定义一个指向wsa(data->数据)的一个指针
  9.         int err;
  10.         wVersionRequested=MAKEWORD(1,1);//设定一个版本号!
  11.         err=WSAStartup(wVersionRequested,&wsaData);//wVersionRequested版本号,&wsData winsocket的实现细节
  12.         if(err!=0)//失败
  13.         {
  14.                 return;//返回
  15.         }
  16.         if( LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//判断请求的版本号是不是1.1
  17.         {
  18.                 WSACleanup();        //不是1.1版本终止winsokeDLL
  19.                 return;//返回
  20.         }
  21.         SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//第一个参数地址族基于ip/TCP,1.1版本的套接字一般固定写为AF_INET!第二的参数是流式套接字,0指地址家族默认协议!填零帮你自动选择
  22.         SOCKADDR_IN addSrv;//定义一个地址结构体变量
  23.         addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY,这样会对所有有效IP都适用//htonl->u_long类型的主机字节序到IP/TCP网络字节序.
  24.         addSrv.sin_family=AF_INET;//固定一般就赋值为AF_INET
  25.         addSrv.sin_port=htons(6000);//端口号

  26.         /*绑定*/bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//第一个参数需要绑定的套接字,第二个参数套接字地址(套接字地址 为接收成功后返回客户端的网络地址
  27.         /*监听*/listen(sockSrv,5);//最多连接等待数为5.
  28.         SOCKADDR_IN addrClient;//用来记录客户端端口ip地址等信息的地址结构.(这个注释是我自己理解的,不过好多教程都不是这么讲的)
  29.         int len=sizeof(SOCKADDR);//计算地址结构的长度
  30.         while(1)
  31.         {                       
  32.                 /*等待*/SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//第一个原套接字,接收客户端信息,第三个参数包含地址结构的长度。//返回新的套接字
  33.                                         printf("N关闭程序\n");
  34.                                         char a[10];
  35.                                         scanf("%s",&a);
  36.                                                 if (strcmp(a,"N") == 0)
  37.                                         {
  38.                                                         break;
  39.                                         }
  40.                 char sendbuf[100];
  41.                 char recvbuf[100];
  42.                 int b=1;
  43.                 while(1)
  44.                 {
  45.                         if(b==1)
  46.                         {
  47.                 sprintf(sendbuf,"客户端IP:%s",inet_ntoa(addrClient.sin_addr));
  48.                 send(sockConn,sendbuf,strlen(sendbuf)+1,0);
  49.                         }
  50.                         b++;
  51.                         printf("等待客户端应答...\n");
  52.                 recv(sockConn,recvbuf,100,0);//参数1当前的套接字,参数2字符缓冲区,参数3长度,参数4,一般为0.
  53.                 printf("%s\n",recvbuf);
  54.                 if(b==2)
  55.                 {       
  56.                                 printf("N退出聊天循环...\n");
  57.                 }
  58.                 scanf("%s",&sendbuf);
  59.                 if (strcmp(sendbuf,"N") == 0)
  60.                  {
  61.                         break;
  62.                  }
  63.                 send(sockConn,sendbuf,strlen(sendbuf)+1,0);//当前连接套接字,发送字符缓冲区,长度,一般为0;
  64.                 }
  65.                 closesocket(sockConn);//关闭套接字
  66.                 WSACleanup();//关闭sock动态连接库
  67.         }
  68. }
复制代码

客户端代码:
  1. #include<windows.h>
  2. #include<stdio.h>
  3. #include<Winsock.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. void main()
  6. {
  7. //WORD wVersionRequested;//定义一个WORD类型变量.
  8.         WSADATA wsaData;//定义一个指向wsa(data->数据)的一个指针
  9.         int err;
  10. //        wVersionRequested=MAKEWORD(1,1);//设定一个版本号!
  11.         err=WSAStartup(MAKEWORD(1,1),&wsaData);//wVersionRequested版本号,&wsData winsocket的实现细节
  12.         if(err!=0)//失败
  13.         {
  14.                 return;//返回
  15.         }
  16.         if( LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//判断请求的版本号是不是1.1
  17.         {
  18.                 WSACleanup();        //不是1.1版本终止winsokeDLL
  19.                 return;//返回
  20.         }
  21.         SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//第一个参数地址族基于ip/TCP,1.1版本的套接字一般固定写为AF_INET!第二的参数是流式套接字,0指地址家族默认协议!填零帮你自动选择
  22.         SOCKADDR_IN addSrv;//定义一个地址结构体变量
  23.         addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//INADDR_ANY,这样会对所有有效IP都适用//htonl->u_long类型的主机字节序到IP/TCP网络字节序.
  24.         addSrv.sin_family=AF_INET;//固定一般就赋值为AF_INET.基于IP/TCP协议
  25.         addSrv.sin_port=htons(6000);//设置端口号6000。将一个无符号短整型的主机数值转换为网络字节顺序
  26.         connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//参数1,要进行连接的套接字,参数2,地址结构体里面有客户端的端口需要连接的服务器IP地址等信息(本人是这样理解的),参数3地址结构体大小
  27.         char sendbuf[100];
  28.         char recvbuf[100];
  29.         while(1)
  30.         {
  31.                 printf("等待服务器端应答.........\n");
  32.         recv(sockClient,recvbuf,100,0);
  33.         printf("%s\n",recvbuf);
  34.         recvbuf[100]=0;
  35.     sendbuf[100]=0;
  36.         scanf("%s",&sendbuf);
  37.         send(sockClient,sendbuf,strlen(sendbuf)+1,0);//发送
  38. //第一个参数是当前套接字,第二个参数是字符缓冲区,第三个参数是计算长度,第4个参数是0一般都是怎么写。
  39.         }
  40.         closesocket(sockClient);//关闭套接字
  41.         WSACleanup();//关闭sock动态连接库

  42. }
复制代码



推荐
发表于 2014-3-25 23:43:04 | 只看该作者
说来真不如unix下面的代码整洁……
沙发
 楼主| 发表于 2014-3-25 23:04:28 | 只看该作者
VC6测试通过。先启动服务器端在启动客户端.
板凳
 楼主| 发表于 2014-3-25 23:05:53 | 只看该作者
上面代码有无用的逻辑判断的一些代码可以删除!刚才发上来排版乱了.现在看起来好乱.各位自己测试!注释的很详细了
5#
 楼主| 发表于 2014-3-26 00:15:12 | 只看该作者
rosynirvana 发表于 2014-3-25 23:43
说来真不如unix下面的代码整洁……

额....                          
6#
发表于 2014-5-26 13:59:38 | 只看该作者
哈哈,好好看看,这个聊天软件服务器和客户端都有,真好
7#
发表于 2014-5-26 19:21:51 | 只看该作者
超神级 发表于 2014-3-25 23:04
VC6测试通过。先启动服务器端在启动客户端.

vc6太高级了,很多菜鸟都用不来……
8#
 楼主| 发表于 2014-5-26 21:00:36 | 只看该作者
deyuww 发表于 2014-5-26 13:59
哈哈,好好看看,这个聊天软件服务器和客户端都有,真好

。。。。。。。。。。。。
9#
 楼主| 发表于 2014-5-26 21:01:20 | 只看该作者
1935515130 发表于 2014-5-26 19:21
vc6太高级了,很多菜鸟都用不来……

一般吧....用段时间就好了
10#
发表于 2014-7-28 09:48:44 | 只看该作者
这么高级啊。。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表