您的位置:首页 > 其它

一个简单的socket服务器但程序

2014-11-04 10:47 330 查看
//头文件

#include <stdio.h>

#include <Winsock2.h>

#include <ws2tcpip.h>

//定义常量

#define DEFAULT_PORT "10000" //端口

#define MAX_REQUEST 1024 //接收数据的缓存大小

#define BUF_SIZE 4096 //发送数据的缓存大小

//定义接收和发送数据的线程函数

DWORD WINAPI CommunicationThread(LPVOID lpParameter)

{

//获取线程ID

DWORD dwTid = GetCurrentThreadId();

//获取套接字

SOCKET socket = (SOCKET)lpParameter;

//为接收数据分配空间

LPSTR szRequest = HeapAlloc(GetProcessHeap(),0,MAX_REQUEST);

//定义变量

int iResult;

int bytesSent;

//接收数据

iResult = recv(socket, //接收套接字

szRequest, //缓存

MAX_REQUEST, //缓存大小

0);//标志

//判断

if(iResult == 0)

{

printf("连接已经关闭....\n");

closesocket(socket);

HeapFree(GetProcessHeap(),0,szRequest);

return 1;

}

else if(iResult == SOCKET_ERROR)

{

printf("接收数据失败,SOCKET错误%d\n",WSAGetLastError());

closesocket(socket);

HeapFree(GetProcessHeap(),0,szRequest);

return 1;

}

else if(iResult > 1)

{

//显示接收到的数据

printf("\tCommunicationThread(%d)\tBytes received:%d\n",dwTid,iResult);

printf("\tCommunicationThread(%d)\trequest string is (%s)\n",dwTid,szRequest);

//如果接收到的数据是"dowload file"

if(lstrcmpi(szRequest,"download file") == 0)

{

//读取download.txt将发送

HANDLE hFile;

LPVOID lpReadBuf;

DWORD dwBytesRead;

DWORD dwFileSize;

DWORD dwSendFile = 0;

hFile = CreateFile("download.txt",

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

0);

if(hFile == INVALID_HANDLE_VALUE)

{

printf("\tCommunicationThread\tCoule not open file(error %d)\n",GetLastError());

send(socket,"error",6,0);

closesocket(socket);

return 1;

}

//分配发送数据的缓存

lpReadbuf = HeapAlloc(GetProcessHeap(),0,BUF_SIZE);

//获取文件大小

dwFileSize = GetFileSize(hFile,NULL);

//循环发送

while(1)

{

//读取文件到缓存

if(!ReadFile(hFile,lpReadBuf,BUF_SIZE,&dwBytesRead,NULL))

{

printf("\tCommunicationThread\tCould not red from file(error %d)\n",GetLasterror());

closesocket(socket);

CloseHandle(hFile);

HeapFree(GetProcessHeap(),0,lpReadbuf);

return 1;

}

//发送读取的文件数据

bytesSent = send(socket,lpReadBuf,dwBytesRead,0);

if(bytesSent = SOCKET_ERROR)

{

printf("\tCommunicationTrhead\tsend drror %d\n",WSAGetLastError());

closesocket(socket);

CloseHandle(hFile);

HeapFree(GetProcessHeap(),0,lpReadbuf);

return 1;

}

//显示发送数据的大小

printf("\tCommunicationThread(%d)\tsend %dbytes\n",dwTid,bytesSent);

//累加,已经发送数据的大小

dwSendFile += dwBytesRead;

//如果所有文件数据都已经发送

if(dwSendFile == dwFileSize)

{

printf("\tCommunicationThread\tFile download ok\n");

break;

}

}

//释放内存、关闭连接、关闭文件

HeapFree(GetProcessHeap(),0,lpReadbuf);

CloseHandle(hFile);

closesocket(socket);

}

//如果接收到的数据是"get information"

else if(lstrcmpi(szRequest,"get information") == 0)

{

//发送数据

bytesSent = send(socket, //套接字

"this is information", //数据

lstrlen("this is informaiton")+1, //数据大小

0);

//判断是否成功

if(bytesSent == SOCKET_ERROR)

{

printf("\tCommunicationThread\tsend error %d\n",WSAGetLastError());

closesocket(socket);

return 1;

}

printf("\tCommunicationthread(%d)\tsend %d bytes\n",dwTid,bytesSent);

}

else //接收未知数据

{

printf("unreferenced request\n");

}

}

//释放接收数据缓存,关闭套接字

HeapFree(GetProcessHeap(),0,szRequest);

closesocket(socket);

return 0;

}

//主函数

int __cdecl main(void)

{

WSADATA wsaData;

SOCKET ListenSocket = INVALID_SOCKET; //监听套接字

SOCKET ClientSocket = INVALID_SOCKET; //连接套接字

struct addrinfo *result = NULL,hints;

int iResult;

//初始化WinSock

iResult = WSAStartup(MAKEWORD(2,2),&wsaData);

if(iResult !=0 )

{

printf("WSAStarup faild: %d\n",iResult);

return ;

}

//地址

ZeroMemory(&hints,sizeof(hints));

hints.ai_family = AF_INET;

hints.ai_socktype = SOCK_STREAM;

hints.ai_protocal = IPPROTO_TCP;

hints.ai_flags = AI_PASSIVE;

//获取主机地址,保证网络协议可用等

iResult = getaddrinfo(NULL, // 主机

DEFAULT_PORT,

&hints,

&result);

if(iResult !=0 )

{

printf("getaddrinfo failed: %d\n",iResult);

WSACleanup();

return 1;

}

//创建套接字,用于监听

ListenSocket = socket(result->ai_family,

result->ai_socktype,

result->ai_protocol);

if(ListenSocket == INVALID_SOCKET)

{

printf("socket failed: %ld\n",WSAGetLastError());

freeaddrinfo(result);

WSACleanup();

return 1;

}

//绑定到端口

iResult = bind(ListenSocket,result->ai_addr,(int)result->ai_addrlen);

if(iResult == SOCKET_ERROR)

{

printf("bind failed: %d\n",WSAGetLastError());

freeaddrinfo(result);

closesocket(ListenSocket);

WSACleanup();

return 1;

}

printf("bind\n");

freeaddrinfo(result);

//开始监听

iResult = listen(ListenSocket,SOMAXCONN);

printf("start listen......\n");

if(iResult == SOCKET_ERROR)

{

printf("listen failed: %d\n",WSAGetLastError());

closesocket(ListenSocket);

WSACleanup();

return 1;

}

while(1)

{

//接收客户端的连接,accept函数会等待,直到连接建立

printf("ready to accept\n");

ClientSocket = accept(ListenSocket,NULL,NULL);

printf("accept a connection\n");

if(ClientSocket= INVALID_SOCKET)

{

printf("accept failed: %d\n",WSAGetLastError());

closesocket(ListeSocket);

break;

}

if(!CreateThread(NULL,

0,

ComunicationThread,

(LPVOID)ClientSocket,

0,

NULL);

{

printf("Create Thread error (%d)\n",GetLastError());

break;

}

}



WSACleanup();

return 0;

}

在语句后基本有注释,有错误地方,请大神指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: