一个简单的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;
#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
- 一个简单的socket服务器但程序
- 一个简单的客户-服务器的Socket通信程序
- 一个socket服务器程序
- 简单的socket 服务器/客户端 程序
- php socket简单的服务器通信程序
- 使用socket和mysql编写一个简单的物联网服务器程序
- 一个简单的socket通信聊天程序
- python3.2 一个简单的socket 程序
- 一个简单入门的win32 socket程序
- 一个简单的socket文件传输程序
- 一个简单的java socket通信程序
- 一个简单的c++ socket服务程序
- 一个简单的Qt socket 程序
- 一个简单的python socket程序
- 一个简单的NIO Socket通信程序
- 一个简单的Socket分包程序
- 一个简单的局域网Socket聊天程序
- 创建一个简单的VC++ Socket程序
- 绿色版的PDF格式文件转换器
- [PHP]会话小结
- 全角半角转换
- 6、谈PLC在数控机床(数控铣床/数控车床/加工中心/钻攻中心)的运用——多普康自动化制作
- 手机网站(html5)之touch事件
- 一个简单的socket服务器但程序
- 使用ScriptManager+UpdatePanel+Timer控件实现在GridView中倒计时功能
- 第10周项目4-大奖赛计分(控制评委人数)
- Wildcard Matching
- 8句话让你彻底明白什么是大数据营销
- MFC的回调函数
- AOSP Android5.0 lollipop 源码同步更新方法
- [PHP]加密小结
- 关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明(指数循环节)