Professional Documents
Culture Documents
#include "stdafx.h"
#include <WinSock2.h>
SOCKADDR_IN serverAddr;
SOCKET s;
WSADATA wsaData;
char* line = NULL;
char* ret = NULL;
int main(int argc, char* argv[])
{
WSAStartup(MAKEWORD(2,2),&wsaData);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(atoi(argv[2]));
serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
line = (char*)calloc(1024,1);
ret = (char*)calloc(1024,1);
if (connect(s,(sockaddr*)&serverAddr,sizeof(serverAddr)) == 0)
{
while (1)
{
printf("Nhap vao lenh: ");
gets(line);
send(s,line,strlen(line),0);
recv(s,ret,1024,0);
printf("%s\n",ret);
}
}else
{
printf("Cannot connect");
}
return 0;
}
Bi 2: Sum Server
// sumserver.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <WinSock2.h>
typedef struct _CLIST
{
SOCKET c;
SOCKADDR_IN addr;
int addrlen;
char* buf;
char* ret;
_CLIST* next;
HANDLE hReady;
}CLIST;
SOCKADDR_IN serverAddr;
SOCKET s;
WSADATA wsaData;
DWORD ThreadID;
CLIST* pClients = NULL;
{
pClients = (CLIST*)calloc(1,sizeof(CLIST));
while (1)
{
pClients->addrlen = sizeof(pClients->addr);
pClients->c = accept(s,(sockaddr*)&pClients->addr,&pClients>addrlen);
pClients->hReady = CreateEvent(NULL,TRUE,FALSE,NULL);
CreateThread(NULL,0,SendingThread,pClients,0,&ThreadID);
CreateThread(NULL,0,RecvingThread,pClients,0,&ThreadID);
pClients->next = (CLIST*)calloc(1,sizeof(CLIST));
pClients = pClients->next;
}
return 0;
}
bind(s,(sockaddr*)&serverAddr,sizeof(serverAddr));
listen(s,10);
WaitForSingleObject(CreateThread(NULL,0,ListeningThread,NULL,0,&ThreadI
D), INFINITE);
return 0;
}
#include "stdafx.h"
#include <string.h>
#include <malloc.h>
#include <WinSock2.h>
SOCKET s;
SOCKADDR_IN saddr;
SOCKET c[MAX_USER_COUNT];
SOCKADDR_IN caddr[MAX_USER_COUNT];
int clen[MAX_USER_COUNT];
int cid[MAX_USER_COUNT];
HANDLE cready[MAX_USER_COUNT];
int usercount = 0;
CRITICAL_SECTION criticalSection;
fd_set fdread;
fd_set fdwrite;
{
//Receive data here
ResetEvent(cready[i]);
memset(buf,0,MAX_STRING_LEN);
recv(c[i],buf,MAX_STRING_LEN,0);
EnterCriticalSection(&criticalSection);
system(strcat(buf,">c:\\temp\\out.txt"));
LeaveCriticalSection(&criticalSection);
SetEvent(cready[i]);
}
if (FD_ISSET(c[i],&fdwrite))
{
WaitForSingleObject(cready[i],INFINITE);
EnterCriticalSection(&criticalSection);
//Write data here
FILE* f = fopen("c:\\temp\\out.txt","rt");
while (!feof(f))
{
memset(buf,0,MAX_STRING_LEN);
fgets(buf,MAX_STRING_LEN,f);
send(c[i],buf,strlen(buf),0);
}
fclose(f);
LeaveCriticalSection(&criticalSection);
}
}
}
return 0;
}
client
recv(c[id],tmpuser,MAX_STRING_LEN,0);
response
send(c[id], passprompt, strlen(passprompt),0);
recv(c[id],tmppass,MAX_STRING_LEN,0);
response
int i = 0;
for (i = 0;i < realcount;i++)
{
printf("Invalid arguments\r\n");
return 0;
}
InitializeCriticalSection(&criticalSection);
user = (char**)calloc(MAX_USER_COUNT,sizeof(char*));
pass = (char**)calloc(MAX_USER_COUNT,sizeof(char*));
//Doc file user - password
FILE* f = fopen("users.txt","rt");
while (!feof(f))
{
user[realcount] = (char*)calloc(MAX_STRING_LEN,sizeof(char));
pass[realcount] = (char*)calloc(MAX_STRING_LEN,sizeof(char));
fscanf(f,"%s%s",user[realcount],pass[realcount]);
realcount += 1;
}
fclose(f);
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2),&wsadata);
FD_ZERO(&fdwrite);
FD_ZERO(&fdread);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
saddr.sin_family = AF_INET;
saddr.sin_port = htons(atoi(argv[1]));
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s,(sockaddr*)&saddr,sizeof(saddr));
listen(s,10);
DWORD ThreadID = 0;
WaitForSingleObject(CreateThread(NULL,0,ListeningThread,NULL,0,&ThreadI
D), INFINITE);
WSACleanup();
return 0;
}
Bi 4 : Completion Port
// CompletionPort.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <WinSock2.h>
HANDLE CompletionPort;
WSADATA wsd;
SYSTEM_INFO SystemInfo;
SOCKADDR_IN InternetAddr;
SOCKET Listen;
struct MYOVERLAPPED
{
OVERLAPPED SystemOverlapped;
int MyStuff;
};
MYOVERLAPPED myoverlapped;
char buff[1024];
WSABUF databuff;
DWORD
flags;
DWORD
bytesReceived = 0;
Socket;
SOCKADDR_STORAGE ClientAddr;
// Other information useful to be associated with the handle
} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;
LPOVERLAPPED Overlapped;
LPPER_HANDLE_DATA PerHandleData;
DWORD SendBytes, RecvBytes;
DWORD Flags;
BOOL ret;
MYOVERLAPPED* lpmyoverlapped;
while(TRUE)
{
// Wait for I/O to complete on any socket
// associated with the completion port
ret = GetQueuedCompletionStatus(CompletionPort,
&BytesTransferred,(LPDWORD)&PerHandleData,
(LPOVERLAPPED *) &lpmyoverlapped, INFINITE);
}
return 0;
}
databuff.buf = buff;
databuff.len = 1024;
// Step 1:
// Create an I/O completion port
CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,
NULL, 0, 0);
// Step 2:
// Determine how many processors are on the system
GetSystemInfo(&SystemInfo);
// Step 3:
// Create worker threads based on the number of
// processors available on the system. For this
// simple case, we create one worker thread for each
// processor.
for(int i = 0; i < SystemInfo.dwNumberOfProcessors; i++)
{
HANDLE ThreadHandle;
ThreadHandle = CreateThread(NULL, 0,
ServerWorkerThread, CompletionPort,
0, NULL);
// Step 4:
// Create a listening socket
Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED);
InternetAddr.sin_family = AF_INET;
InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
InternetAddr.sin_port = htons(5000);
bind(Listen, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr));
SOCKADDR_IN saRemote;
SOCKET Accept;
int RemoteLen;
// Step 5:
// Accept connections and assign to the completion port
RemoteLen = sizeof(saRemote);
Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote,
&RemoteLen, NULL, NULL);
// Step 6:
// Create per-handle data information structure to associate with the
socket
PerHandleData = (LPPER_HANDLE_DATA)
GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
printf("Socket number %d connected\n", Accept);
PerHandleData->Socket = Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);
// Step 7:
// Associate the accepted socket with the completion port
CreateIoCompletionPort((HANDLE) Accept, CompletionPort,
(DWORD) PerHandleData, 0);
// Step 8:
// Start processing I/O on the accepted socket.
// Post one or more WSASend() or WSARecv() calls
// on the socket using overlapped I/O.
myoverlapped.MyStuff = 10;
WSARecv(Accept, &databuff, 1, &bytesReceived, &flags,
(LPOVERLAPPED)&myoverlapped, NULL);
}
return 0;
}