TCP Server

#include <STDIO.H>
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
#define BUFFER_SIZE	10

/*Server*/
DWORD WINAPI RecvThread(LPVOID lpParam)
{
	printf("start to Recv\n");
	LPSTR lpRecv = (LPSTR)HeapAlloc(GetProcessHeap(), 0, BUFFER_SIZE);

	SOCKET sock = (SOCKET)lpParam;
	int nRecv = 0;
	BOOL bRead = TRUE;
	while(bRead)
	{
		while(1)
		{
			nRecv = recv(sock, lpRecv, BUFFER_SIZE, 0);
			if (nRecv==BUFFER_SIZE)
			{
				printf("%s", lpRecv);
			}
			else if (nRecv<BUFFER_SIZE && nRecv>0)
			{
				printf("%s\n", lpRecv);
				break;
			}
			else if(nRecv==0)
			{
				printf("\nReceive Over.");
				break;
			}
			else
			{
				int error = WSAGetLastError();
				switch(error)
				{
				case WSAECONNRESET:
					printf("\nerror:%d, %s\n", GetLastError(), "socket is closed at remote");
					break;
				case WSAECONNABORTED:
					printf("\nerror:%d, %s\n", GetLastError(), "socket is closed at local");
					break;
				}
				closesocket(sock);
				bRead = FALSE;
				break;
			}
		}
	}
	HeapFree(GetProcessHeap(),0,lpRecv);
	closesocket(sock);
	return 0;
}
DWORD WINAPI SendThread(LPVOID lpParam)
{
	printf("start to send\n");
	SOCKET sock = (SOCKET)lpParam;
	char buf[1024] = {0};
	while(1)
	{
		printf("Input:");
		scanf("%s", buf);
		if (send(sock, buf, sizeof(buf), 0)!=sizeof(buf))
		{
			printf("send error: %d\n", WSAGetLastError());
			break;
		}
	}
	closesocket(sock);
	return 0;
}

int main(int argc, char **argv)
{
	HANDLE child[2];
	int err;
	int len;
	SOCKET sListen;
	SOCKET sConnect;
	WSADATA wsaD;
	struct sockaddr_in my_addr;
	struct sockaddr_in client_addr;
	u_short port;
//	char buf[BUFFER_SIZE];
	int addrlen;
	port = 10000;
	err = WSAStartup(MAKEWORD(1,1), &wsaD);
	if (0!=err)
	{
		printf("Error: %d WSAStartup error!\n", err);
		WSACleanup();
		return -1;
	}
	if( (sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))==SOCKET_ERROR )
	{
		err = WSAGetLastError();
		printf("Error: %d socket error!\n", err);
		WSACleanup();
		return -1;
	}
	memset(&my_addr, 0, sizeof(my_addr));
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(port);
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	if( bind(sListen, (struct sockaddr*)&my_addr, sizeof(my_addr))==SOCKET_ERROR)
	{
		err = WSAGetLastError();
		printf("Error: %d socket error!\n", err);
		closesocket(sListen);
		WSACleanup();
		return -1;
	}
	if (listen(sListen, 5) == SOCKET_ERROR)
	{
		err = WSAGetLastError();
		printf("Error: %d socket error!\n", err);
		closesocket(sListen);
		WSACleanup();
		return -1;
	}
	printf("Listening on port %d\n", ntohs(my_addr.sin_port));
	
	addrlen = sizeof(client_addr);
	while(1)
	{
		printf("start to accept\n");
		if ( (sConnect=accept(sListen, (struct sockaddr*)&client_addr, &addrlen))!=INVALID_SOCKET)
		{
			printf("%s has connected to this server.\n", inet_ntoa(client_addr.sin_addr));
		}
		if (!(child[0]=CreateThread(NULL,
						  0, 
						  RecvThread, 
						  (LPVOID)sConnect, 
						  0, 
						  NULL)))
		{
			printf("Create  recv thread error: %d\n", WSAGetLastError());
			break;
		}
		if (!(child[1]=CreateThread(NULL,
						  0,
						  SendThread,
						  (LPVOID)sConnect,
						  0,
						  NULL)))
		{
			printf("Create  send thread error: %d\n", WSAGetLastError());
			break;
		}
		printf("Create a new thread,\n");
	}
	WaitForMultipleObjects(2, child, TRUE, INFINITE);
	WSACleanup();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值