`
hereson
  • 浏览: 1427641 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

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



想要实现的功能:在服务器端有一个控制台程序(或者Windows服务),与多个客户端程序通讯,其中主线程有一个socket绑定在一个固定端口上,负责监听客户端的Socket信息。每当启动一个客户端程序,客户端发送来一个socket连接请求,server端就新开启一个线程,并在其中创建一个socket与该客户端的socket通讯,直到客户端程序关闭,结束该线程。主线程中的socket在应用程序退出时关闭。

这里是Server端代码的简单示意,展示了如何创建多线程的Socket Server。

#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并发送数据就行了。

 
分享到:
评论

相关推荐

    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