- 博客访问: 320
- 博文数量: 1
- 博客积分: 0
- 博客等级: 民兵
- 技术积分: 20
- 用 户 组: 普通用户
- 注册时间: 2015-08-04 21:27
分类: C/C++
2015-08-04 21:44:23
-
/* TCPServer.cpp - main */
-
-
#include <stdlib.h>
-
#include <stdio.h>
-
#include <winsock2.h>
-
#include <time.h>
-
#include "conio.h"
-
#include <windows.h>
-
#include <process.h>
-
-
#define QLEN 5
-
#define WSVERS MAKEWORD(2, 0)
-
#define MAXSSOCKCNT 20000
-
#define BUFLEN 2000
-
#define BUFCNT 20
-
-
#pragma comment(lib,"ws2_32.lib") // π”√winsock 2.2 library
-
-
struct strussock{
-
SOCKET sock; // ??Ω”?÷
-
struct sockaddr_in fsin; // ”√????÷∑
-
char buffer[BUFCNT][BUFLEN+1]; // ?÷∑????∫≥???
-
int bufcnt; // ?∫≥??? ???
-
int bufptr; // ÷∏????“???“?∑??????∫≥???
-
HANDLE hSemaphore; // ??÷?∑?????–≈∫≈??
-
bool isExit; // ±? ?”√?? ?∑?“—??≥?
-
CRITICAL_SECTION cs; // ??Ω???
-
int len;
-
}sockets[MAXSSOCKCNT];
-
-
HANDLE handles[500][2];
-
int clientCount = 0; //”√”???????????”√?? ???
-
/*------------------------------------------------------------------------
-
* main - Iterative TCP server for TIME service
-
*------------------------------------------------------------------------
-
*/
-
-
unsigned _stdcall MyRecv(void * p)
-
{
-
strussock *newP = (strussock *)p; // ÷∏???±?∞?¨Ω”??Ω·ππ????÷∏’?
-
struct sockaddr_in fsin = newP->fsin;
-
char rBuf[BUFLEN + 1]; // ∑??????”??????Ω” ??????????÷∑???
-
char *pts;
-
char port[10];
-
time_t now; // ”√”??????±?∞ ±?‰
-
int rLen; // ????Ω” ??÷∑???≥§??
-
-
while(1){
-
rLen = recv(newP->sock, rBuf, BUFLEN, 0);
-
itoa(newP->fsin.sin_port,port,10);
-
-
newP->len = rLen;
-
(void) time(&now); // ?°?√???≥ ±?‰
-
pts = ctime(&now); // ∞— ±?‰???????÷∑???
-
-
if(rLen == SOCKET_ERROR || rLen == 0){ //∑??÷”–”√????≥? ±??????
-
clientCount--; //”√?? ???“?∏?
-
EnterCriticalSection(&newP->cs);
-
-
int ptr = (newP->bufptr + newP->bufcnt) % BUFCNT; // ??????“?∏??’?∫≥???????÷√
-
if(newP->bufcnt + 1 > BUFCNT){} // ?‘?∫≥???“?≥?????????????’????π√???≥…?????©
-
-
newP->isExit = 1; // …?÷√”√????≥?±? ???’?
-
-
sprintf(newP->buffer[ptr], "”√??ip: %s ”√??port: %s %s ??????.\n",
-
inet_ntoa(fsin.sin_addr), port, pts); // ??Ω”??’???????”√??IP+ ±?‰+?????©
-
printf("%s", newP->buffer[ptr]); // ‰≥??Ω∑??????∞??
-
newP->bufcnt = newP->bufcnt+1; // ?∫≥??? ????”“?
-
-
LeaveCriticalSection(&newP->cs);
-
ReleaseSemaphore(newP->hSemaphore, 1, NULL);
-
break;
-
}
-
else if(rLen > 0) {
-
EnterCriticalSection(&newP->cs);
-
-
int ptr = (newP->bufptr + newP->bufcnt) % BUFCNT;
-
if(newP->bufcnt + 1 > BUFCNT){}
-
-
memcpy(newP->buffer[ptr], rBuf, rLen);
-
-
newP->bufcnt = newP->bufcnt+1;
-
-
LeaveCriticalSection(&newP->cs);
-
ReleaseSemaphore(newP->hSemaphore, 1, NULL);
-
}
-
}
-
// delete newP; // ?∑≈–?Ω?struParam±‰??
-
return 0;
-
}
-
-
unsigned _stdcall MySend(void * p)
-
{
-
strussock *newP = (strussock *)p;
-
while (!newP->isExit) {
-
WaitForSingleObject(newP->hSemaphore, INFINITE);
-
-
EnterCriticalSection(&newP->cs);
-
-
for(int i = 0; i < MAXSSOCKCNT; i++){ //∑????Ω??”–??????
-
if(sockets[i].sock != NULL) {
-
char msg[BUFLEN+1];
-
memcpy(msg, newP->buffer[newP->bufptr], newP->len);
-
(void) send(sockets[i].sock, msg, newP->len, 0);
-
}
-
}
-
newP->bufcnt = newP->bufcnt - 1; // ∑???“???????∫??∫≥??? ?????“?
-
newP->bufptr = (newP->bufptr + 1) % BUFCNT; // ÷∏????“?????÷∏’???∫?“?“???
-
-
LeaveCriticalSection(&newP->cs);
-
}
-
newP->sock = NULL;
-
return 0;
-
}
-
-
void
-
main(int argc, char *argv[])
-
/* argc: √???––≤? ?∏? ??¨ ?????∫C:\> TCPServer 8080
-
argc=2 argv[0]="TCPServer",argv[1]="8080" */
-
{
-
struct sockaddr_in fsin; /* the from address of a client */
-
SOCKET msock, ssock; /* master & slave sockets */
-
WSADATA wsadata;
-
char *service = "60000";
-
struct sockaddr_in sin; /* an Internet endpoint address */
-
int alen; /* from-address length */
-
char *pts; /* pointer to time string */
-
time_t now; /* current time */
-
-
-
WSAStartup(WSVERS, &wsadata); // ?”‘?winsock library°?WSVERS÷∏√????? π”√??∞?±?°?wsadata∑??????≥ ?? ÷?≥÷????∏?∞?±?
-
msock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // ??Ω???Ω”?÷?¨≤? ??∫“?????–≠“???(family)?¨????Ω”?÷?¨TCP–≠“?
-
// ∑????∫“???????Ω”?÷??√? ?∑???INVALID_SOCKET
-
-
memset(sockets,NULL,sizeof(sockets));
-
memset(&sin, 0, sizeof(sin)); // ?”&sin?? ???≥§????sizeof(sin)????????0
-
sin.sin_family = AF_INET; // “???????÷∑??(INET-Internet)
-
sin.sin_addr.s_addr = INADDR_ANY; // ??????”–(Ω”????)IP??÷∑°?
-
sin.sin_port = htons((u_short)atoi(service)); // ??????????∫≈°?atoi--∞—ascii??????int?¨htons--÷??˙–??Ω????–?(16??)
-
bind(msock, (struct sockaddr *)&sin, sizeof(sin)); // ∞?????????IP??÷∑∫?????∫≈
-
-
listen(msock, 5); // ????Ω????¨Ω”???”?–≥§????5
-
-
while(!_kbhit()){ // ??≤? ?∑?”–∞???
-
alen = sizeof(struct sockaddr); // ?°?Ω??÷∑Ω·ππ??≥§??
-
ssock = accept(msock, (struct sockaddr *)&fsin, &alen); // ??π?”––????¨Ω”?????¨∑????¨Ω”??Ω”?÷?¨∑?‘??¨±?????°?fsin∞?∫¨??????IP??÷∑∫?????∫≈
-
int i = 0;
-
while(1){
-
if(sockets[i].sock == NULL){
-
sockets[i].sock = ssock;
-
sockets[i].fsin = fsin;
-
sockets[i].bufcnt = 0;
-
sockets[i].bufptr = 0;
-
sockets[i].isExit = 0;
-
sockets[i].hSemaphore = CreateSemaphore(NULL,0,1,NULL);
-
sockets[i].cs = CRITICAL_SECTION();
-
InitializeCriticalSection(&(sockets[i].cs));
-
break;
-
}
-
i++;
-
}
-
clientCount++;
-
strussock *asock;
-
asock = &sockets[i];
-
unsigned threadId;
-
handles[i][0] = (HANDLE)_beginthreadex(NULL, 0, &MyRecv, (void *)asock, 0, NULL);
-
handles[i][1] = (HANDLE)_beginthreadex(NULL, 0, &MySend, (void *)asock, 0, NULL);
-
}
-
-
(void) closesocket(msock); // π?±’??????Ω”?÷
-
WSACleanup(); // –?‘?winsock library
-
-
}
-
/* TCPClient.cpp */
-
-
#include <stdlib.h>
-
#include <stdio.h>
-
#include <winsock2.h>
-
#include <time.h>
-
#include <string.h>
-
#include <process.h>
-
-
#define BUFLEN 2000 // ???????ó??
-
#define WSVERS MAKEWORD(2, 0) // ???÷°?±?2.0
-
#pragma comment(lib,"ws2_32.lib") // ????winsock 2.0 Llibrary
-
-
/*------------------------------------------------------------------------
-
* main - TCP client for TIME service
-
*------------------------------------------------------------------------
-
*/
-
-
CRITICAL_SECTION cs;
-
-
unsigned __stdcall MyRecv(void *p)
-
{
-
SOCKET *newP = (SOCKET *)p; // ?????à??×???
-
char pts[BUFLEN+1];
-
while(true)
-
{
-
EnterCriticalSection(&cs);
-
int rLen = recv(*newP, pts, BUFLEN, 0); // cc??????????×?·???????(>0)?ò??·?????±?(=0)?ò???????í(<0)
-
LeaveCriticalSection(&cs);
-
if(rLen == SOCKET_ERROR || rLen==0)
-
{
-
printf("Error: %d.\n",GetLastError()); //???í?????ó±?????±??×??×?sock??
-
&nb