windows下socket套接字

一、首先说下什么是套接字

    套接字的概念与文件句柄类似, 一个套接字就是一个通讯标识,由一个短整数标识,实际上就是一个句柄,代表网络协议中的一组数据,该数据包含了通信双方的ip地址和当前的连接状态等信息。我们知道,如果一个文件被打开,可以通过文件句柄对文件进行读写操作,套接字也一样。

二、然后我们来看看什么是网络

计算机网络是相互连接的独立自主的计算机的集合。它主要由 IP地址, 协议, 网络体系结构。

1、 IP网络中每台主机都必须有一个唯一的IP地址,inet网上的IP地址具有全球唯一性

2、协议为进行网络中的数据交换而建立的规则,标准或约定。

3、网络体系结构 他可以有七层参考模型,  应用层,表示层,会话层,传输层,网络层,链路层,物理层。

三、接着我们对于服务器和客户端创建网络连接的步骤进行分析

   对于服务器

1、初始化Windows Socket库 (使用到的函数WSAStartup))

2、创建Socket (socket)

3、绑定Socket (bind)

4、监听 (使用listen)

5、Accept

6、接收、发送数据

   对于客户端

1、初始化Windows Socket库

2、创建Socket

3、连接Socket

4、接收、发送数据


四、接下来看一下服务器的一个简单例子

#include <iostream>
#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.lib")
#define SERVER_PORT 5208	// 监听端口

WORD wVersionRequested;
WSADATA wsaData;
SOCKET sListen, sServer;// 监听套接字和连接套接字
sockaddr_in saServer, saClient;	// 地址信息
// 初始化 winsocke
void initWinSock()
{
	int ret;
	
	// WinSock初始化
	wVersionRequested = MAKEWORD(2, 2 );	// 希望使用的WinSOCK DLL的版本
	// Winsock服务的初始化
	ret = WSAStartup( wVersionRequested, &wsaData );
	if ( ret != 0 )
	{
		printf( "WSAStartup() failed! \n" );
		return;
	}
}

// 创建socket
void createSocket()
{
	// 创建Socket,使用TCP协议
	sListen = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
	if ( sListen == INVALID_SOCKET )
	{
		WSACleanup();
		printf("socket() faild! \n");
		return;
	}
}

// 绑定socket
void bindSocket()
{
	// 构建本地地址信息
	int ret;
	saServer.sin_family = AF_INET;						// 地址家族
	saServer.sin_port = htons(SERVER_PORT);				// 注意转化为网络字节序
	saServer.sin_addr.S_un.S_addr = htons(INADDR_ANY);	// 使用INADDR_ANY  指示任意地址

	// 绑定
	ret = bind( sListen, (struct sockaddr*)&saServer, sizeof(saServer) );
	if ( ret == SOCKET_ERROR )
	{
		printf("bind() faild! code:%d\n", WSAGetLastError());
		closesocket(sListen); //关闭套接字
		WSACleanup();
		return;
	}
}

// listen
void listenSocket()
{
	// 监听连接请求
	int ret;
	ret = listen( sListen, 5 );
	if ( ret == SOCKET_ERROR )
	{
		printf( "listen() failed! code:%d \n", WSAGetLastError() );
		closesocket(sListen);
		return;
	}
}

// accept
void acceptSocket()
{
	int nLength;
	nLength = sizeof( saClient );
	
	sServer = accept( sListen, (struct sockaddr*)&saClient, &nLength );
	if ( sServer == INVALID_SOCKET )
	{
		printf( "accept() failed! code:%d \n", WSAGetLastError() );
		closesocket( sListen );	// 关闭套接字
		WSACleanup();
		return;
	}
}

// 接收消息
void recvMessage()
{
	int ret;
	char receiveMessage[5000];
	ret = recv( sServer, receiveMessage, 5000, 0 );
	if ( ret == SOCKET_ERROR )
	{
		printf( "recv() failed! \n" );
		return;
	}
	printf( "receive message:%s\n", receiveMessage );	// 打印我们接收到的消息。
}

int main()
{
	int ret, nLeft, nLength;
	// 第一步初始化Windows Socket库 
	initWinSock();
	// 第二步创建Socket
	createSocket();
	// 第三步绑定Socket
	bindSocket();
	// 第四步listen
	listenSocket();

	printf( "Waiting for client connecting ! \n");
	printf( "Tips: Ctrl+c to quit! \n");
	// 阻塞等待接收客户端连接
	while (1)
	{
		// 第五步阻塞等待客户端的连接。
		acceptSocket();
		// 第六步收消息
		recvMessage();
	}
	return 0;
}
五 再看一下客户端的例子

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "WS2_32.lib")
#define SERVER_PORT 5208	// 侦听端口
WORD wVersionRequested;
WSADATA wsaData;
int ret;
SOCKET sClient;						// 连接套接字
struct sockaddr_in saServer;		// 地址信息
char* ptr = NULL;
BOOL fSuccess = TRUE;

// 初始化 winsocke库
void initWinSock()
{
	// WinSock 初始化
	wVersionRequested = MAKEWORD(2,2);	// 希望使用的WinSock DLL的版本
	ret = WSAStartup(wVersionRequested, &wsaData );
	if ( ret != 0 )
	{
		printf("WSAStartup() failed! \n");
		return;
	}

	// 确认WinSock DLL支持版本2.2
	if ( LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		printf( "Invalid WinSock version! \n");
		return;
	}
}

// 创建socket
void createSock()
{
	// 创建socket,使用TCP协议
	sClient = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
	if ( sClient == INVALID_SOCKET )
	{
		WSACleanup();
		printf("socket() failed! \n");
		return;
	}
}

// connect
void connectServer()
{
	// 构建服务器地址
	saServer.sin_family = AF_INET;			// 地址家族
	saServer.sin_port = htons(SERVER_PORT);	// 注意转化为网络节序
	saServer.sin_addr.S_un.S_addr = inet_addr( "127.0.0.1" );

	// 连接服务器
	ret = connect( sClient, (struct sockaddr*)&saServer, sizeof(saServer) );
	if ( ret == SOCKET_ERROR )
	{
		printf( "connect() failed! \n ");
		closesocket(sClient);	// 关闭套接字
		WSACleanup();
		return;
	}
}
// 向服务器发送信息
void sendMessage()
{
	char sendMessage[] = "hello this is client message!";
	ret = send(sClient,(char*)&sendMessage, sizeof(sendMessage), 0);
	if ( ret == SOCKET_ERROR )
	{
		printf( "send() failed! \n" );
	}
	printf( "client info has been sent!");
}

int main()
{
	// 第一步初始化Windows Socket库
	initWinSock();
	// 第二步创建Socket
	createSock();
	// 第三步连接Socket;
	connectServer();
	// 第四步接收、发送数据
 	sendMessage();

	closesocket(sClient);		// 关闭套接字
	WSACleanup();

	return 0;
}

简单说明一下,  这个例子服务器仅仅是实现了一个接收功能,  当服务器启动时socket前几步就完成然后等待客户端的连接, 当客户端连接上时可以等待接收信息。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值