?? 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 + -