多线程TCP socket服务器

// 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值