现在的位置: 首页 > 综合 > 正文

socket网络编程之TCP_Server

2013年10月05日 ⁄ 综合 ⁄ 共 1498字 ⁄ 字号 评论关闭
#include <Winsock2.h>
#include <stdio.h>
#include <windows.h>
#include <string.h>

DWORD WINAPI RecvProc(
  LPVOID lpParameter   // thread data
);


struct RECVPARAM
{
	SOCKET sock;
	SOCKADDR_IN sockaddr;
};
void main()
{
	WORD wVersionRequseted;
	WSADATA wsaData;
	int err;
	wVersionRequseted = MAKEWORD(1, 1);
	err = WSAStartup(wVersionRequseted, &wsaData);
	if(err!=0)
	{
		return;
	}
	if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) !=1)
	{
		WSACleanup();
		return;
	}

	SOCKET socketSrv = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	
	bind(socketSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));

	listen(socketSrv, 5);

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);


	HANDLE hRecvThread;
	RECVPARAM *pRecvParam=new RECVPARAM;
	
	printf("服务器启动\n");
	while(1)
	{
		SOCKET sockConn = accept(socketSrv, (SOCKADDR*)&addrClient, &len);

		pRecvParam->sock=sockConn;
		pRecvParam->sockaddr = addrClient;
		hRecvThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
	}
	delete pRecvParam;
	
}

DWORD WINAPI RecvProc(
  LPVOID lpParameter   // thread data
)
{
	char recvBuf[200];
	memset(recvBuf,0 ,200);

	SOCKET sockClient =((RECVPARAM*)lpParameter)->sock;
	SOCKADDR_IN addrClient = ((RECVPARAM*)lpParameter)->sockaddr;
	printf("%s 进入连接\n", inet_ntoa(addrClient.sin_addr));
	while(TRUE)
	{
		if(!recv(sockClient, recvBuf, 200,0))
		{
			printf("%s 客户端断开连接\n", inet_ntoa(addrClient.sin_addr));
			break;
		}
		if(0==strcmp(recvBuf, "abc"))
		{
			send(sockClient, "thank you!", strlen("thank you!"), 0);
			closesocket(sockClient);
			break;
		}
		printf("%s\n", recvBuf);
	}
	
	printf("线程终止\n");
	return 0;
}

抱歉!评论已关闭.