`
fp_moon
  • 浏览: 981684 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

套接口复用实现的聊天室的程序

阅读更多

//只要按要求将程序中的注释部份改为注释所述就可以运行了

/*VC下编写多线程程序除了包含头文件

       #include <process.h>

一定要记住如下的设定,不然编译会出错的://Project->Settings->C/C++->CategoryCode GenerationUse run-time libraryMultithreaded */

 

//TCP:client.cpp

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

void __cdecl Get_keybeard_input(void*param)
{
SOCKET Sock=(SOCKET)param;
while(1)
{
   char info[MSG_MAX_SIZE];
   gets(info);
   int ret=send(Sock,info,MSG_MAX_SIZE,0);
   if(ret==SOCKET_ERROR)
   {
    printf("send()failed:%d\n",WSAGetLastError());
    closesocket(Sock);
      WSACleanup();
      continue;
   }
}
}


int main()
{
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
   printf("Error at WSAStartup()\n");
   return -1;
}

SOCKET Sock;
    Sock = socket(AF_INET, SOCK_STREAM, 0);
if (Sock == INVALID_SOCKET)
{
   printf("Error at socket(): %ld\n", WSAGetLastError());
   WSACleanup();
   return -1;
}

sockaddr_in service;
service.sin_family = AF_INET;
service.sin_port = htons(27015);
service.sin_addr.s_addr = inet_addr("ip");           //将此处的IP改为服务器程序运行的主机IP(用点分十进制)

int err=connect(Sock,(SOCKADDR*) &service, sizeof(service));
if(err==SOCKET_ERROR)
{
   printf("connect() failed: %ld\n", WSAGetLastError());
   closesocket(Sock);
   WSACleanup();
   return -1;
}

_beginthread(Get_keybeard_input,0,(void*)Sock);
char recv_buf[MSG_MAX_SIZE];
while(1)
{
   memset(recv_buf,0,MSG_MAX_SIZE);
   int rlen=recv(Sock,recv_buf,MSG_MAX_SIZE,0);
   if(rlen==0) break;
   if(rlen==SOCKET_ERROR)
   {
            printf("recv() failed: %ld\n", WSAGetLastError());
      closesocket(Sock);
      WSACleanup();
      return -1;
   }
   puts(recv_buf);
}
closesocket(Sock);
WSACleanup();
return 0;
}

 

 

 

//TCP:server.cpp

#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#include <stdio.h>
int main()
{
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
   printf("Error at WSAStartup()\n");
   return -1;
}

SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, 0);
if (ListenSocket == INVALID_SOCKET)
{
   printf("Error at socket(): %ld\n", WSAGetLastError());
   WSACleanup();
   return -1;
}

sockaddr_in service;
service.sin_family = AF_INET;
service.sin_port = htons(27015);
service.sin_addr.s_addr = inet_addr("IP");     //将此处的IP改为的主机IP(用点分十进制表示)

if (bind( ListenSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR)
{
   printf("bind() failed: %ld\n", WSAGetLastError());
   closesocket(ListenSocket);
   WSACleanup();
   return -1;
}
if (listen( ListenSocket, 1 ) == SOCKET_ERROR)
{
   printf("listen() failed: %ld\n", WSAGetLastError());
   closesocket(ListenSocket);
   WSACleanup();
   return -1;
}

SOCKET client[FD_SETSIZE - 1];  
for(int i = 0;i < FD_SETSIZE;i++)  
{
   client[i] =INVALID_SOCKET;
}

fd_set   rset, allset;   //allset--所有套接口, rset--可读套接口
FD_ZERO(&allset);  
FD_SET(ListenSocket, &allset);  

#define MSG_MAX_SIZE 1024
char   buf[FD_SETSIZE - 1][MSG_MAX_SIZE];  

for(;;)
{  
   rset = allset;   //structure assignment
    int ret = select(0,&rset,NULL,NULL,NULL);
           if (ret == SOCKET_ERROR)
   {  
    printf("select() failed: %ld\n", WSAGetLastError());
    break;
   }  
   if (ret == 0) {
    continue;
   }
   if(FD_ISSET(ListenSocket, &rset))
   {  
    struct   sockaddr_in   cliaddr;  
    int clilen   =   sizeof(cliaddr);  
    SOCKET sockConn = accept(ListenSocket,(sockaddr *)&cliaddr, &clilen);
    if (sockConn == SOCKET_ERROR)
    {
     printf("accept() failed: %ld\n", WSAGetLastError());
     break; //continue
    }  
    for(i = 0; i < FD_SETSIZE - 1; i++)
    {
     if(client[i] == INVALID_SOCKET)
     {  
      client[i]   =   sockConn;  
      break;  
     }  
    } //for end
    if(i < FD_SETSIZE - 1)
    {  
     FD_SET(sockConn, &allset);  
    }  
    else{
     printf("too   many   clients");  
     closesocket(sockConn);
    }
    //为了理解容易,可以删除下面4行
    ret --;
    if(ret   <=   0)
    {
     continue;  
    }
   }// if (FD_ISSET(ListenSocket, &rset)) end

   for(i = 0; i < FD_SETSIZE - 1; i++)  
   {  
    if ((client[i] != INVALID_SOCKET) &&
      FD_ISSET(client[i], &rset))  
    {  
     memset(buf[i], 0 , MSG_MAX_SIZE);
     int nByte = recv(client[i], buf[i], MSG_MAX_SIZE, 0);
     if (nByte == SOCKET_ERROR)
     {
      printf("recv() failed: %ld\n", WSAGetLastError());
      FD_CLR(client[i],&allset);  
      closesocket(client[i]);
      client[i] = INVALID_SOCKET;
      continue;
     }
     if (nByte == 0)
     {
      FD_CLR(client[i],&allset);  
      closesocket(client[i]);
      client[i] = INVALID_SOCKET;
      continue;
     }
     //do the request
     for(int j=0;j<FD_SETSIZE-1;j++)
     {
      if(i!=j)
      int ret=send(client[j],buf[i],MSG_MAX_SIZE,0);
      if(ret==SOCKET_ERROR)
      {
       printf("send()failed:%d\n",WSAGetLastError());
       continue;
      }

     }
    }
   }//loop client end
}// for(;;) end
closesocket(ListenSocket);
WSACleanup();
return 0;
}

分享到:
评论

相关推荐

    B.7基于套接口复用的聊天室系统

    广西科技大学网络程序设计实验代码 B.7基于套接口复用的聊天室系统

    python写的socket聊天室程序,包括客户端和服务端

    总结来说,这个Python聊天室程序展示了如何使用`socket`模块和`select`函数实现基本的网络通信功能,特别是服务端如何处理多个并发的客户端连接。通过学习和理解这个示例,开发者可以进一步掌握Python在网络编程中的...

    基于VC编聊天室程序

    实现聊天室程序需要涉及以下核心知识点: 1. **Winsock API**:包括初始化WSAStartup,创建套接字(socket),绑定(bind),监听(listen),接受连接(accept),发送(send)和接收(recv)数据等函数。 2. **...

    C++实现 UDP实现聊天室

    在这个“C++实现 UDP实现聊天室”的项目中,我们将探讨如何利用C++语言结合UDP协议创建一个简单的聊天应用。 首先,我们需要了解UDP的基础知识。UDP不提供连接建立、数据顺序保证或错误校正,因此适用于实时通信如...

    Linux下聊天室实现(基于C)

    下面将详细介绍这个聊天室实现的关键知识点。 首先,我们要理解TCP/IP协议族。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它提供了数据包的顺序传递和错误检查功能。IP(互联网...

    MMS.rar_java聊天室_聊天室小程序

    【描述】中提到的“JAVA写的一个小聊天室程序,支持普通聊天功能”,暗示了该程序的核心功能包括用户之间的文本消息传递。在Java编程中,这通常涉及到多线程技术,用于处理并发的用户输入和输出,以及网络通信技术,...

    基于C语言实现 Linux 系统下的聊天室程序【100012562】

    在Linux环境下开发聊天室程序,可以利用其强大的网络编程接口,如套接字(socket)编程,实现进程间通信。 3. **多用户并发处理**: 为了支持多用户同时在线聊天,服务器需要能够处理多个并发连接。这通常通过创建...

    c语言实现的udp聊天室

    在这个聊天室中,开发者通过观看网络编程视频学习并实践了相关知识,这包括套接字编程的基本概念、UDP协议的工作原理以及多路复用技术如select或poll等。 实现用户管理功能时,采用了链表数据结构。链表是一种动态...

    微信聊天微信小程序源码.zip

    - 社交分享:利用微信的社交属性,小程序可以轻松实现分享到朋友圈、聊天窗口等功能,提高传播效果。 - 画布与动画:提供丰富的绘图和动画API,如canvas、svg,可以创建复杂的交互式图形和动态效果。 4. 代码组织...

    java聊天室(绝对经典)

    在"JAVA聊天室程序.rar"中,你可能会看到一个基于Swing或JavaFX的图形用户界面(GUI)的实现,这使得用户可以直接在窗口中输入和查看消息。而在"java+Sockt聊天室.rar"中,可能侧重于网络通信的细节,展示了如何通过...

    基于TCP协议分别使用多线程、IO 多路复用的方法实现多人聊天室(python).zip

    这个项目名为“基于TCP协议分别使用多线程、IO 多路复用的方法实现多人聊天室(python)”,它深入探讨了Python中如何利用这两种并发模型来处理多个客户端连接,从而创建一个高效的多人聊天平台。下面我们将详细探讨...

    linux系统下实现聊天室

    以下是实现这个聊天室的关键知识点: 1. **Socket编程**:Socket是网络通信的基本接口,它允许两个或更多的进程通过网络进行通信。在Linux中,我们使用`socket()`函数创建一个套接字,`bind()`函数绑定一个端口,`...

    网络聊天室源代码(API函数编写)

    本篇文章将深入探讨一个特殊的项目——“网络聊天室”,它是通过API函数而非MFC(Microsoft Foundation Classes)类库来实现的。对于想要了解底层编程或对网络通信感兴趣的开发者来说,这是一个极好的学习案例。 ...

    ASP源码—金手指wap聊天室程序.zip

    【ASP源码—金手指wap聊天室程序】是一款基于ASP技术构建的移动设备聊天室系统,主要用于为手机用户提供在线交流的平台。ASP(Active Server Pages)是微软开发的一种服务器端脚本语言,常用于创建动态网页。这个...

    Java课程设计(简易聊天室)

    在构建聊天室时,可能会用到工厂模式(用于创建Socket对象)、单例模式(用于保证服务器实例的唯一性)等设计模式,提高代码的可维护性和复用性。 通过这个项目,学生不仅能巩固Java基础知识,还能深入理解网络...

    java聊天室(仿QQ),socket+线程实现

    Java聊天室是一个基于Socket和线程技术实现的通信应用程序,其设计灵感来源于QQ,旨在帮助开发者深入理解Java网络编程的核心概念。在这个项目中,我们主要会涉及到以下几个关键知识点: 1. **Java Socket**:Socket...

    linux网络聊天室(select服务器)

    这个描述暗示了该聊天室程序曾经采用多线程模型,每个客户端连接都有一个独立的线程来处理。然而,为了提高效率和简化管理,开发者将模型转换为使用`select`。尽管线程代码仍然存在于源代码中,但它们现在被`select`...

    javaTcpIp文件系统登录实现简单的聊天室功能

    5. **聊天室功能**:客户端和服务器之间建立多路复用连接,允许多个客户端同时在线聊天。服务器接收所有客户端的消息并广播给其他在线用户。 在描述中提到的“文件系统登录”,可能是指将用户信息存储在文件系统中...

    java源码:Java多用户聊天室程序(毕业设计).rar

    这个聊天室程序很可能使用了Java的Socket编程来实现客户端和服务器端的通信,通过TCP协议保证数据的可靠传输。同时,为了处理多个用户的并发聊天,程序可能会使用多线程技术,每个连接的客户端对应一个独立的线程,...

    Java多用户聊天室程序(毕业设计)

    【Java多用户聊天室程序(毕业设计)】是一款基于Java编程语言开发的软件,主要用于实现多个用户间的实时在线交流。这个项目通常会涉及到网络编程、多线程、并发处理、Socket通信以及用户界面设计等多个核心Java知识...

Global site tag (gtag.js) - Google Analytics