vs2010,Win32控制台程序:


服务器端:


// Win32_Socket_Server.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")  

int _tmain(int argc, _TCHAR* argv[])
{
	WORD sVersion;
	WSADATA sWsa;
	int nRes;

	sVersion = MAKEWORD(1, 1);

	nRes = WSAStartup(sVersion, &sWsa);
	if (nRes != 0)
	{
		printf("Server:%d", WSAGetLastError());
		return 0;
	}

	// 创建
	SOCKET socket_Server = socket(AF_INET, SOCK_STREAM, 0);
	if (socket_Server == INVALID_SOCKET)
	{
		printf("Server:%d", WSAGetLastError());
		return 0;
	}

	// 绑定
	SOCKADDR_IN addr_Server;
	addr_Server.sin_family = AF_INET;
	addr_Server.sin_port = htons(8888);  // CMD:netstat -ano(确保端口未被占用)
	addr_Server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	nRes = bind(socket_Server, (SOCKADDR*)&addr_Server, sizeof(SOCKADDR));
	if (nRes != 0)
	{
		printf("Server:%d", WSAGetLastError());
		return 0;
	}

	// 监听
	listen(socket_Server, 5);  // 后一个参数表示允许同时连接的人数
	printf("listening...\n\n");
	while (1)
	{
		SOCKADDR addr_Client;
		int len = sizeof(addr_Client);
		SOCKET socket_Client = accept(socket_Server, &addr_Client, &len);
		if (socket_Client != INVALID_SOCKET)
		{
			printf("New Connection:%s\n\n", inet_ntoa( ((SOCKADDR_IN*)&addr_Client)->sin_addr) );
			// 发送
			char szTmp[] = "Server:This is Server!\n\n";
			send(socket_Client, szTmp, strlen(szTmp) + 1, 0);

			// 接收
			char revBuf[128] = {0};
			recv(socket_Client, revBuf, sizeof(revBuf), 0);
			printf("%s\n\n", revBuf);
		}

		// 关闭
		closesocket(socket_Client);
	}

	// 关闭
	closesocket(socket_Server);
	WSACleanup();

	getchar();
	return 0;
}



客户端:


// Win32_Socket_Client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")  


int _tmain(int argc, _TCHAR* argv[])
{
	WORD sVersion;
	WSADATA sWsa;
	int nRes;

	sVersion = MAKEWORD(1, 1);

	nRes = WSAStartup(sVersion, &sWsa);
	if (nRes != 0)
	{
		printf("Server:%d\n\n", WSAGetLastError());
		return 0;
	}

	// 创建
	SOCKET socket_Client = socket(AF_INET, SOCK_STREAM, 0);
	if (socket_Client == INVALID_SOCKET)
	{
		printf("Server:%d", WSAGetLastError());
		return 0;
	}

	// 连接
	SOCKADDR_IN addr_Server;
	addr_Server.sin_family = AF_INET;
	addr_Server.sin_port = htons(8888);  // CMD:netstat -ano(确保端口未被占用)
	addr_Server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	nRes = connect(socket_Client, (SOCKADDR*)&addr_Server, sizeof(SOCKADDR));
	if (nRes != 0)
	{
		if (WSAGetLastError() == WSAECONNREFUSED)
		{
			printf("错误代码10061:服务器端未启动!\n\n");
			return 0;
		}
		printf("Server:%d\n\n", WSAGetLastError());
		return 0;
	}

	// 接收
	char revBuf[128] = {0};
	recv(socket_Client, revBuf, sizeof(revBuf), 0);
	printf("%s\n\n", revBuf);

	// 发送
	char szTmp[] = "Client:This is Client!\n\n";
	send(socket_Client, szTmp, strlen(szTmp) + 1, 0);

	// 关闭
	closesocket(socket_Client);
	WSACleanup();

	getchar();
	return 0;
}




运行截图:

(1)启动服务器:

windows套接字(socket)TCP篇_Server

(2)启动客户端:

windows套接字(socket)TCP篇_#include_02

(3)服务器端:

windows套接字(socket)TCP篇_#include_03



另注:关于库文件的导入有两种方式,除了显式地用语句#pragma comment(lib,"ws2_32.lib"),

还可以右键项目 -> 属性 -> 配置属性 -> 链接器 -> 输入 ->

windows套接字(socket)TCP篇_Server_04

windows套接字(socket)TCP篇_Server_04