// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <string.h>
#pragma comment( lib, "ws2_32.lib" )
#define PORT 2046
#define BACKLOG 10
#define TRUE 1
struct networkData
{
networkData()
{
sock = 0;
memset(&address, 0, sizeof(address));
}
SOCKET sock;
struct sockaddr_in address;
};
DWORD WINAPI run(LPVOID lpParameter)
{
SOCKET clientSocket=((networkData*)lpParameter)->sock;
struct sockaddr_in clientAddress = ((networkData*)lpParameter)->address;
printf("Accept connection from %s\n", inet_ntoa(clientAddress.sin_addr));
char buf[4096];
//while (1){
//接收数据
int bytes;
if ((bytes = recv(clientSocket, buf, sizeof(buf), 0)) == SOCKET_ERROR){
printf("接收数据失败!\n");
closesocket(clientSocket);
return 0;
}
buf[bytes] = '\0';
printf("Message from %s: %s\n", inet_ntoa(clientAddress.sin_addr), buf);
if (send(clientSocket, buf, bytes, 0) == SOCKET_ERROR){
printf("发送数据失败!");
closesocket(clientSocket);
return 0;
}
closesocket(clientSocket);
//清理套接字占用的资源
printf("%s exit!\n", inet_ntoa(clientAddress.sin_addr));
return 0;
}
int main()
{
WSADATA wsa;
//初始化套接字DLL
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0){
printf("套接字初始化失败!");
exit(-1);
}
//创建套接字
SOCKET serverSocket;
if ((serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){
printf("创建套接字失败!");
exit(-1);
}
struct sockaddr_in serverAddress;
memset(&serverAddress, 0, sizeof(sockaddr_in));
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
serverAddress.sin_port = htons(PORT);
//绑定
if (bind(serverSocket, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR){
printf("套接字绑定到端口失败!端口: %d\n", PORT);
exit(-1);
}
//进入侦听状态
if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR){
printf("侦听失败!");
exit(-1);
}
printf("Server %d is listening......\n", PORT);
while (true)
{
SOCKET clientSocket;//用来和客户端通信的套接字
struct sockaddr_in clientAddress;//用来和客户端通信的套接字地址
memset(&clientAddress, 0, sizeof(clientAddress));
int addrlen = sizeof(clientAddress);
//接受连接
if ((clientSocket = accept(serverSocket, (sockaddr*)&clientAddress, &addrlen)) == INVALID_SOCKET){
printf("接受客户端连接失败!");
closesocket(clientSocket);
continue;
}
networkData *lpParamdata=new networkData;
lpParamdata->sock = clientSocket;
lpParamdata->address = clientAddress;
HANDLE hThread1 = CreateThread(NULL, 0, run, (LPVOID)lpParamdata, 0, NULL);
CloseHandle(hThread1);
//run(clientSocket, clientAddress);
}
WSACleanup();
return 0;
}
多线程TCP socket服务器
最新推荐文章于 2022-11-15 23:54:18 发布