`
abs200311235
  • 浏览: 122502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现服务器端的多线程SOCKET Server

阅读更多
           实现服务器端的多线程SOCKET Server  
   想要实现的功能:在服务器端有一个控制台程序(或者Windows服务),与多个客户端程序通讯,其中主线程有一个socket绑定在一个固定端口上,负责监听客户端的Socket信息。每当启动一个客户端程序,客户端发送来一个socket连接请求,server端就新开启一个线程,并在其中创建一个socket与该客户端的socket通讯,直到客户端程序关闭,结束该线程。主线程中的socket在应用程序退出时关闭。  
这里是Server端代码的简单示意,展示了如何创建多线程的Socket Server。  
Cpp代码
#include  "StdAfx.h"    
#include  <stdio.h>    
DWORD  WINAPI  AnswerThread(LPVOID  lparam)    
{    
           SOCKET  ClientSocket=(SOCKET)(LPVOID)lparam;    
           int  bytesRecv;    
           char  sendbuf[32]="";    
           char  recvbuf[32]="";       
           while(1)    
           {    
                  bytesRecv=SOCKET_ERROR;    
                  for(int  i=0;i<(int)strlen(recvbuf);i++)    
                     {   recvbuf[i]=''''\0'''';  }  
                       while(bytesRecv==SOCKET_ERROR)    
                       {  //Receiving Data  
                       bytesRecv=recv(ClientSocket,recvbuf,32,0);    
                       }                       
                       //Write your processing code here  
                    send(ClientSocket,recvbuf,strlen(recvbuf),0);    
                    printf("%s\n",recvbuf);    
               }    
               return  0;    
}        

int  main(int  argc,char*  argv[])    
{    
           //initialize  Winsock    
           WSADATA  wsaData;    
           int  iRet=WSAStartup(MAKEWORD(2,2),&wsaData);    
           if(iRet!=NO_ERROR)    
           printf("Error  at  WSAStartup()\n");                   
           //create  a  socket    
           SOCKET  m_socket;    
           m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);    
           if(m_socket==INVALID_SOCKET)    
           {    
           printf("Error  at  socket():%ld\n",WSAGetLastError());    
                   WSACleanup();    
                   return  0;    
           }     
           //bind  a  socket    
           sockaddr_in  service;    
           service.sin_family=AF_INET;    
           service.sin_addr.s_addr=inet_addr("172.16.3.250");    
           service.sin_port=htons(2501);    
          if(bind(m_socket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)    
           {      printf("bind()  failed.\n");    
                       closesocket(m_socket);    
                       return  0;    
           }    
           else    
                       printf("bind  OK.\n");    
           //listen  on  a  socket    
           if(listen(m_socket,20)==SOCKET_ERROR)    
                     printf("Error  listening  on  socket.\n");   
         else    
            printf("listening  ok.\n");      
           //accept  a  connection    
           SOCKET  AcceptSocket;           
           printf("Waiting  for  a  client  to  connect...\n");    
           while(1)    
           {    
                 AcceptSocket=SOCKET_ERROR;    
                 while(AcceptSocket==SOCKET_ERROR)    
                  {    
                    AcceptSocket=accept(m_socket,NULL,NULL);    
                     }    
                       printf("Client  Connected.\n");        
                       DWORD  dwThreadId;    
                       HANDLE  hThread;    
                           
        hThread=CreateThread(NULL,NULL, AnswerThread,    
                       (LPVOID)AcceptSocket,0,&dwThreadId);    
                       if(hThread==NULL)    
                       {                     
                  printf("CreatThread  AnswerThread()failed.\n");    
                       }    
                       else    
                       {    
                              printf("CreateThread  OK.\n");    
                       }    
           }    
           return  0;    
}  
Socket的客户端程序就很简单了,可以使用VB拖一个WinSock控件到Form中,然后连接服务器的Socket并发送数据就行了。 
转自: http://hereson.iteye.com/blog/240691
分享到:
评论
1 楼 mj1389541 2009-10-20  
    hThread=CreateThread(NULL,NULL, AnswerThread,    
                       (LPVOID)AcceptSocket,0,&dwThreadId);    
请问在这创建的线程会自动释放吗?
另外,如果在该线程中执行的业务如果长时间不结束,这个线程的最后的命运又如何?对整个系统的影响有多大?

相关推荐

    C Socket通信多线程数据双向收发实例VS2010(全部源码)

    1、运用多线程和Socket技术实现Socket Server端侦听多个客户端请求; 2、实现服务器端循环处理客户端不同请求从而实现不同测试要求,并向客户端循环发送数据; 3、实现客户端向服务器端发送不同测试命令,并接收...

    使用TCPServer编写(多线程)socket服务

    使用TCPServer编写(多线程)socket服务 http://blog.csdn.net/ghostfromheaven/article/details/8653421

    客户端和服务器端socket所线程程序

    网络原理的作业,要求可以用tcp和udp进行server和client的通信,多线程处理,server端口可在命令行中设置,client端退出不影响server client和several程序在一个工程内

    C# 一个精心编写的SOCKET SERVER

    支持长短连接、端口范围选择,通过异步多线程支持大并发量,可以选择服务器端随机延时,支持链接断开方式的选择,支持信息展示,写日志文件等。

    socket服务器端编程

    VC6.0实现Server端Socket编程 可通过TCP协议与UDP协议传输数据并实现多线程 在命令行输入参数:端口号

    Linux聊天室 -- select && 多线程实现

    采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. ...

    基于多线程的Linux聊天室系统

    用C语言编程实现linux简单的聊天室功能。  用户程序命名为client.c;服务器程序命名为server.c  绑定端口等信息见实验方法内容;  要求client可以通过socket连接server ... 可选择使用多线程实现多客户端;

    Java+Swing即时聊天系统,客户端和服务端,多线程,socket

    简单的即时聊天系统,实现私聊,公聊,用户上下线提醒 服务器ServerStart启动 客户端Chat启动

    java NIO socket聊天室

    使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 1,运行server.bat启动服务器,可以打开编辑,修改端口号 ...

    java网络白板

    自己写的一个网络白板程序,有客户端和服务器端,服务器实现多线程,并且可以实时显示连接数及连接的ip,客户端实现绘图功能,并把图像发到服务器端,服务器转发给其他客户端。代码是用java写的,采用的基本Server/...

    tcpSever-TCP服务器端程序

    实用、稳定的Tcp Server端,客户端连接后可实现数据的接收与对客户端数据的群发,多线程技术确保系统能够稳定地接收数据。

    java socket通信 一对多

    1)设计程序,分别构建通信的两端:服务器端和客户端应用程序,套接字类型为面向连接的Socket,自己构建双方的应答模式,实现双方的数据的发送和接收(S发给C,C发给S)。 2)服务端程序能响应单个或任意多个客户端...

    一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)

    思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象 ,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的...

    使用VC++的网络编程总结

    1.套接字编程原理 1.1 Client/server 通信模型 1.2 Windows Sockets 规范 1.3 套接字 1.3.1 套接字定义 1.3.2 分类 1.3.3 套接字的作用 1.3.4 端口与地址 ...5. 怎样实现服务器端多线程的socket 功能?

    server_client通信程序

    服务器客户端通信程序,socket编程。

    HD_UID_SERVER(服务器端)

    这是服务器端代码,是多线程的,写得不是那么好

    大文件socket通讯传输

    基于linux下的c/c++程序,多线程,断点续传功能没有实现, 可传输大于2G的文件。 设计思想:预先分配的N个...【4】服务器端,命令行./Server_NBuffer 要传输的文件名 【5】客户端,命令行./Client_NBuffer 服务器地址

    Qt socket 通讯小例子

    有三个小例子 其中socket是客户端 server是单线程服务器端 multithreadServer 是多线程的服务器端 socket使用回环地址 所以只能在本机上测试 需要远程测试 请修改socket中的IP地址

    java解读NIOSocket非阻塞模式.zip

    client多线程请求server端,server接收client的名字,并返回Hello!+名字的字符格式给client。当然实际应用并不这么简单,实际可能是访问文件或者数据库获取信息返回给client。非阻塞的NIO有何神秘之处?直接上代码...

Global site tag (gtag.js) - Google Analytics