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

来源:互联网 发布:人物关系网络 算法 编辑:程序博客网 时间:2024/05/18 18:21
//头文件
#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;


}


在语句后基本有注释,有错误地方,请大神指出。

0 0