实现服务器端的多线程SOCKET Server C+/VC
[
2008-7-30 22:34:00
| 发表者 :
zihe
]
想要实现的功能:在服务器端有一个控制台程序(或者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并发送数据就行了。
上一篇:
VC+求助 C+/VC 下一篇:
VC+设计图形显示CPU内存利用率程序 asp编程