Win Socket基础

// netServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32")

int main()
{
	//第一步:WinSock初始化
	WORD wVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	//WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令。
	if (WSAStartup(wVersion,&wsaData)) {
		printf("WSAStartup......\n");
		return 0;
	}

	//第二步:创建套接字
	SOCKET hServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == hServer) {
		printf("INVALID_SOCKET ERROR\n");
		return 0;
	}

	//对sockaddr_in结构体填充地址、端口等信息
	sockaddr_in addrServer;
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(8848);
	addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	//第三步:绑定套接字与地址信息
	int nRet = bind(hServer,(sockaddr *)&addrServer,sizeof(addrServer));
	if (nRet == SOCKET_ERROR) {
		printf("BIND ERROR\n");
		closesocket(hServer);
		WSACleanup();
		return 0;
	}

	//第四步:监听套接字
	nRet = listen(hServer, 10);
	if (nRet == SOCKET_ERROR) {
	
		printf("LISTEN ERROR\n");
		closesocket(hServer);
		WSACleanup();
		return 0;
	}
	//第五步:获取连接请求
	SOCKET hClient;
	sockaddr_in addrClient;
	int nLen = sizeof(addrClient);

	hClient = accept(hServer,(sockaddr *)&addrClient,&nLen);

	if (INVALID_SOCKET == hClient) {
	
		printf("ACCEPT ERROR\n");
		closesocket(hClient);
		closesocket(hServer);
		WSACleanup();
		return 0;

	}


	//第六步:循环接收发客户端数据
	char szBuf[255];
	while (true)
	{
		memset(szBuf, 0, sizeof(char) * 255);
		nRet = recv(hClient,szBuf,255,0);
		if (SOCKET_ERROR == nRet)
		{
			printf("RECV ERROR\n");
			closesocket(hClient);
			closesocket(hServer);
			WSACleanup();
			return 0;
		}

		char sPrintBuf[512];
		//旧API
		sprintf_s(sPrintBuf, "IP:%s,recv msg:%s",inet_ntoa(addrClient.sin_addr),szBuf);
		//char IPdotdec[20];
		//新API
		//inet_ntop(AF_INET, &addrClient.sin_addr, IPdotdec, 16);
		//sprintf_s(sPrintBuf,"IP:%s recv msg:%s", IPdotdec,szBuf);
		
		printf(sPrintBuf);

		if (strcmp(szBuf,"close")==0) {
		
			nRet = send(hClient, "close", strlen("close"),0);
			break;
		}
		else {
		
			sprintf_s(sPrintBuf, "recv:%s", szBuf);
			nRet = send(hClient,sPrintBuf,strlen(sPrintBuf),0);
			
			if (SOCKET_ERROR == nRet) {
				printf("SEND ERROR\n");
				closesocket(hClient);
				closesocket(hServer);
				WSACleanup();
				return 0;
			}
			
		}
	}
    return 0;
}


猜你喜欢

转载自blog.csdn.net/mypc2010/article/details/80418470
win