编写一个TCP 并发服务器程序,用于接收上题的客户程序发来的学号、姓名、年龄以及程序设计课的考试成绩等信息,收到信息后在屏幕上显示。注意,该服务器为允许多个客户同时接入的并发服务器,要求用多线程技术实现。
#include "iostream"
#include "winsock2.h"
#define PORT 65432
#pragma comment(lib,"ws2_32.lib")
using namespace std;
unsigned long _stdcall thrdFun(void *par);
typedef struct {
char name[11];
char stdNum[10];
unsigned short age;
int score;
} Student;
int main()
{
SOCKET newsock,sock_server;
struct sockaddr_in addr,client_addr;
DWORD ThreadID;
HANDLE hThread;
int addr_len = sizeof(struct sockaddr_in);
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData)!=0)
{
cout<<"加载winsock.dll 失败!\n";
return 0;
}
if ((sock_server = socket(AF_INET,SOCK_STREAM,0))<0)
{
cout<<"创建套接字失败!\n";
WSACleanup();
return 0;
}
addr.sin_family =AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock_server,(LPSOCKADDR)&addr,sizeof(addr))!=0)
{
cout<<"绑定地址失败!\n";
closesocket(sock_server);
WSACleanup();
return 0;
}
if(listen(sock_server,5)!=0)
{
cout<<"listen 函数调用失败!\n";
closesocket(sock_server);
WSACleanup();
return 0;
}
else
cout<<"listenning......\n";
while(true)
{
newsock = accept(sock_server,(LPSOCKADDR)&client_addr,&addr_len);
if(newsock!=INVALID_SOCKET)
{
cout<<"cnnect from "<<inet_ntoa(client_addr.sin_addr)<<endl;
hThread=CreateThread(NULL,0,thrdFun,(LPVOID)newsock,0,&ThreadID);
}
else
break;
}
closesocket(sock_server);
WSACleanup();
return 0;
}
/*****************线程函数**************************/
unsigned long _stdcall thrdFun(void *par)
{
Student a={"","",0,0};
SOCKET sock=(SOCKET)par;
int size=recv(sock,(char *)&a,sizeof(a),0);
a.age=ntohs(a.age);
a.score =ntohl(a.score);
cout<<a.name <<" "<<a.stdNum<<" " <<a.age<<"" <<a.score <<endl;
closesocket(sock);
return 0;
}