console 内网聊天 (TcpChat)

本文展示了如何使用C++通过TCP协议创建一个简单的内网聊天室。包括服务器端(TcpChatSrv)和客户端(TcpChatClient)的代码实现,允许用户通过命令行输入消息并进行交流。服务器监听6000端口,客户端连接到127.0.0.1的6000端口进行通信。当接收到'q'字符时,会终止聊天并关闭连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)
                                /*console 下的内网聊天室*/
          TcpChatSrv(服务器端)

#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")

void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 2, 2 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }

 if ( LOBYTE( wsaData.wVersion ) != 2 ||
   HIBYTE( wsaData.wVersion ) != 2 ) {
  WSACleanup( );
  return;
 }
 
 SOCKET SockSrv=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrsrv;
 addrsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 /Sockets htonl function converts a u_long from host to TCP/IP network byte order (which is big-endian).
 转换主机字节序到网络字节序 
 服务器端绑定INADDR_ANY (0.0.0.0)  即是服务器有多个ip。告诉操作系统:“我需要在 yyyy 端口上侦听,所以发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的数据,都是我处理的。”这时候,服务器程序则在0.0.0.0这个地址上进行侦听。*/
 addrsrv.sin_family=AF_INET;
 addrsrv.sin_port=6000;

 bind(SockSrv,(sockaddr*)&addrsrv,sizeof(SOCKADDR));
 listen(SockSrv,10);

 int len=sizeof(SOCKADDR);
 SOCKADDR_IN addrclient;

 SOCKET SockConnect=accept(SockSrv,(sockaddr*)&addrclient,&len);

 char sendbuf[100];
 char recvbuf[100];
 char tempbuf[100];

 while (1)
 {
  recv(SockConnect,recvbuf,100,0);
  if('q'==recvbuf[0]){
      printf("%s/n","客户端请求退出!");
   send(SockConnect,"q",sizeof('q')+1,0);
   break;}

  sprintf(tempbuf,"%s say:%s",inet_ntoa(addrclient.sin_addr),recvbuf);
  /*格式化几个字符数组到一个数组中,inet_ntoa function convers an (ipv4)network address into a     string */
  printf("%s/n",tempbuf);
  printf("please input data!/n");
  
  gets(sendbuf);
  send(SockConnect,sendbuf,strlen(sendbuf)+1,0);
 }
 closesocket(SockConnect);
 closesocket(SockSrv);
 WSACleanup();


}

 

            TcpChatClient(客户端)

#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib,"ws2_32")

void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 2, 2 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }

 if ( LOBYTE( wsaData.wVersion ) != 2 ||
   HIBYTE( wsaData.wVersion ) != 2 ) {
  WSACleanup( );
  return;
 }
 
 SOCKET SocketClient=socket(AF_INET,SOCK_STREAM,0);
 
 SOCKADDR_IN AddrSrv;
 AddrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 /*inet_addr convers string(ipv4) to address for the IN_ADDR structrue.转换string 到 IN_ADDR*/
 AddrSrv.sin_family=AF_INET;
 AddrSrv.sin_port=6000;

 connect(SocketClient,(sockaddr*)&AddrSrv,sizeof(SOCKADDR));

 char sendbuf[100];
 char recvbuf[100];
 char tempbuf[100];

 while (1)
 {
  printf("please input data!/n");
  gets(sendbuf);
          send(SocketClient,sendbuf,strlen(sendbuf)+1,0);
  recv(SocketClient,recvbuf,100,0);
  if(recvbuf[0]=='q')
  {
   printf("%s/n","服务器端请求退出!");
   send(SocketClient,"q",2,0);
   break;
  }
  
  sprintf(tempbuf,"%s say:%s",inet_ntoa(AddrSrv.sin_addr),recvbuf);
  printf("%s",recvbuf);
  
 
 }
 
 closesocket(SocketClient);
 WSACleanup();

}


心得::printf("%s",recvbuf);//这句话中%s的s必须为小写  ,否则编译无错,但不能显示数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值