📄 server.cpp
字号:
/* ==========================================================
* 开发人员:牛冠杰
* 当前版本:1.0
* 创建时间:2006-11-13
* 修改时间:2006-11-13
* 功能说明:TCP通信中的服务器端程序,采取Winsock编程方法
* 使用方法:server [port]
*/
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")
#define MAX_REV_BUFFER 4096 /* 最大接收缓存 */
/* ==========================================================
* 开发人员:牛冠杰
* 编写时间:2006-11-13
* 函数名称:usage()
* 参数说明:无
* 功能说明:显示服务器使用方法,使用错误时退出程序
*/
void usage()
{
printf("usage: server [listen-port]\n\n");
exit(1);
}
/* ==========================================================
* 开发人员:牛冠杰
* 编写时间:2006-11-13
* 函数名称:ClientThread(LPVOID lpParam)
* 参数说明:lpParam 传递的socket
* 功能说明:服务器负责与客户端通信的线程
*/
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET client_sock=(SOCKET)lpParam;
char recvBuff[MAX_REV_BUFFER];
int ret;
struct sockaddr_in peerhost;
int len=sizeof(peerhost);
getpeername(client_sock,(struct sockaddr*)&peerhost,&len); // 获得客户端IP地址信息
while(1)
{
ret = recv(client_sock, recvBuff, MAX_REV_BUFFER, 0);
if (ret == 0) // 没有接收到任何数据
{
break;
}
else if (ret == SOCKET_ERROR)
{
printf("接收数据失败: %d\n", WSAGetLastError());
break;
}
recvBuff[ret] = '\0';
printf("接收到客户端 %s 信息: %s\n", inet_ntoa(peerhost.sin_addr),recvBuff); // 输出客户端发送的消息
}
return 0;
}
/* ==========================================================
* 开发人员:牛冠杰
* 编写时间:2006-11-13
* 函数名称:main(int argc, char **argv)
* 参数说明:
* 功能说明:主程序,负责服务器端的启动
*/
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET listen_sock;
SOCKET client_sock;
unsigned int listen_port;
int AddrSize;
HANDLE hThread;
struct sockaddr_in localaddr;
struct sockaddr_in clientaddr;
if(argc < 2)
{
usage();
}
else
{
listen_port=atoi(argv[1]);
}
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("加载Winsock失败!\n");
return 0;
}
// 创建监听的socket
listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (listen_sock == SOCKET_ERROR)
{
printf("创建监听的socket失败 : %d\n", WSAGetLastError());
return 0;
}
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(listen_port);
// 对监听的socket进行地址绑定
if (bind(listen_sock, (struct sockaddr *)&localaddr,
sizeof(localaddr)) == SOCKET_ERROR)
{
printf("绑定socket失败 : %d\n", WSAGetLastError());
return 0;
}
// 开始监听,最大同时连接数设置为20
listen(listen_sock, 20);
printf("服务器在端口%d开始监听\n",listen_port);
// 开始无限循环,接受客户端的连接
while (1)
{
AddrSize = sizeof(clientaddr);
// 接受客户端的连接
client_sock = accept(listen_sock, (struct sockaddr *)&clientaddr, &AddrSize);
if (client_sock == INVALID_SOCKET)
{
printf("接受连接失败: %d\n", WSAGetLastError());
break;
}
printf("客户端 %s 连接到服务器\n", inet_ntoa(clientaddr.sin_addr));
// 创建客户端线程
hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)client_sock, 0, 0);
if (hThread == NULL)
{
printf("创建客户端线程失败: %d\n", GetLastError());
break;
}
CloseHandle(hThread);
}
closesocket(listen_sock);
WSACleanup();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -