您的位置:首页 > 编程语言 > C语言/C++

一个多线程的Socket通信Demo(C语言实现)

2014-11-18 19:46 399 查看
-----------这是客户端程序--------------

#include "stdio.h"
#include "winsock2.h"
#include "stdlib.h"

#pragma comment(lib,"ws2_32")

void main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in sockaddr;
sockaddr.sin_family = PF_INET;
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_port = htons(9000);

connect(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));

char buffer[MAXBYTE] = {0};
recv(s,buffer,MAXBYTE,NULL);
printf(" ***SERVER*** %s",buffer);
while(TRUE)
{
char* mymsg = new char[10000];
printf(" OK Now You Can Connect .\n ->");
gets(mymsg);
send(s,mymsg,strlen(mymsg)+sizeof(char),NULL);
}
closesocket(s);
WSACleanup();
getchar();
exit(0);

}
-----这是服务端程序------
#include "stdio.h"
#include "winsock2.h"
#include "stdlib.h"
#define MAXCLIENTS 2

#pragma comment(lib,"ws2_32")
/*
多线程
SOCKET
*/

DWORD WINAPI ProcessClientRequest(LPVOID lpParam)
{
SOCKET* clientsocket = (SOCKET*)lpParam;
char* msg = "Hello, Welcome to connect . \r\n";
send(*clientsocket,msg,strlen(msg)+sizeof(char),NULL);
printf("---SYS----    Hello @_@\n");
while(TRUE)
{
char buffer[MAXBYTE] = {0};
recv(*clientsocket,buffer,MAXBYTE,NULL);
if(strcmp(buffer,"exit")==0)
{
char* exit_msg = "Bye \r\n";
send(*clientsocket,exit_msg,strlen(exit_msg)+sizeof(char),NULL);
break;
}
printf("--- Sys: %s--\n",buffer);
}
closesocket(*clientsocket);
return 0;
}

int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
SOCKET s = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in sockaddr;
sockaddr.sin_family = PF_INET;
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_port = htons(9000);
bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR));
listen(s,1);
printf("listening on port[%d].\n",9000);
char* msg = new char[1000];

HANDLE threads[MAXCLIENTS];    //线程存放 数组
int CountClient = 0;
while(TRUE)
{
SOCKADDR clientAddr;
int size = sizeof(SOCKADDR);
SOCKET clientsocket;
clientsocket = accept(s,&clientAddr,&size);        //阻塞模式 直到有新的Tcp 接入
printf("Sys: New client touched ID is %d .\n",CountClient+1);            //
if(CountClient < MAXCLIENTS)                        //创建新线程
{
threads[CountClient ++] = CreateThread(NULL,0,&ProcessClientRequest,&clientsocket,0,NULL);
}
else                                                //线程数超了 拒绝服务
{
char *msg = " Error Too many client Connecttion  !.\r\n";
send(clientsocket,msg,strlen(msg)+sizeof(char),NULL);
printf(" ** SYS **  REFUSED !.\n");
closesocket(clientsocket);
}
}

printf("Maximize clients occurred for d%.\r\n", MAXCLIENTS);
WaitForMultipleObjects(MAXCLIENTS,threads,TRUE,INFINITE);
closesocket(s); //关闭socket

for(int i=0;i<MAXCLIENTS;i++)
{
CloseHandle(threads[i]);
}

WSACleanup();
getchar();
exit(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: