一个简单的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;
}
在语句后基本有注释,有错误地方,请大神指出。
#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;
}
在语句后基本有注释,有错误地方,请大神指出。
相关文章推荐
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- 一个简单的客户-服务器的Socket通信程序
- TCP/TP编程 - 一个简单的Linux下C写的socket服务器客户端程序
- 用java实现的一个简单web服务器程序
- 一个简单而又灵活的IOCP模块——完成端口通讯服务器(IOCP Socket Server)设计(四)
- 【实验 1-2】编写一个简单的 UDP 服务器和 UDPP 客户端程序。程序均为控制台程序窗口。
- JAVA编写的一个简单的Socket实现的HTTP响应服务器
- 一个Socket服务器样板程序
- 【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。
- 一个win32平台的socket简单程序
- 一个简单的服务器和客户端的心跳程序
- 一个简单的java socket通信程序
- 用JAVA实现一个简单地Socket服务器,可以实现发给指定对象
- Java做一个最简单的Socket通话程序
- 一个简单的socket服务端和客户端程序:客户端发送数据给服务端,服务端接收到数据后再给客户端发送数据
- 一个简单的socket客户端发送消息到服务器端程序
- VC写的socket程序实现一个简单Echo服务器端和客户端程序
- 一个简单的linux下原生socket的tcp程序及其修改
- 一个简单入门的win32 socket程序
- 一个简单的基于socket的通讯处理程序