码迷,mamicode.com
首页 > Windows程序 > 详细

windows socket基础

时间:2015-05-17 23:37:58      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

本来想写个聊天系统,暂时水平有限,不浪费时间,以后再补上吧

服务器代码:

#include <Winsock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment (lib, "ws2_32.lib")

using namespace std;

void main()
{
	//windows特有 使用WSAStarup() 初始化套接字库。相当于分配网络资源 
	WSADATA wsaData;
	int err = WSAStartup(0x0101, &wsaData);
	if (err != 0 )
	{
		return;
	}
	//windows特有 设置网络库的版本
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		//windows 特有 对应的网络资源释放
		WSACleanup();
		return;
	}
	//创建套接字  AF_INET 代表IPV4   SOCK_STREAM socket类型  0指定协议类型 0默认IPPROTO_TCP tcp协议
	SOCKET sockServ = socket(AF_INET, SOCK_STREAM, 0);
	if (INVALID_SOCKET == sockServ)
	{
		WSACleanup(); //这时候只是设置 socket参数 并没有创建 所以不需要closeSocket(sock_id);
		return;
	}
	// 上面同linux  socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1

	SOCKADDR_IN addrServ;
	//ip地址设置为 INADDR_ANY,让系统自动获取本机地址
	addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl 转换ip地址格式的函数
	addrServ.sin_port = htons(6000);//设置端口号6000
	addrServ.sin_family = AF_INET; //IPV4

	//把地址组中特定的地址 赋值给socket 
	err = bind(sockServ, (SOCKADDR*)&addrServ, sizeof(SOCKADDR));
	if (0 != err)
	{
		WSACleanup();//这时候也没有真正的创建socket 也是再设置必要的参数
		return;
	}
	//这时候真正创建了socket  监听该socket  设置最大连接数量
	listen(sockServ, SOMAXCONN);

	//循环监听客户端请求 这里将会存储每个客户端的信息 比如ip 端口 
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);

	while(1)
	{
		//接受客户端请求 客户端信息放在addrClient 如果不关心 后面连个参数都可以设为NULL
		//阻塞直到有客户端连接,不然多浪费CPU资源。  
		SOCKET sockConn = accept(sockServ, (SOCKADDR*)&addrClient, &len);
		char sendBuf[255];
		cin >> sendBuf ;
		//send 向客户端发送数据
		send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);

		char recvBuf[255];
		//接受客户端传来的数据 接受的数据写入到recvBuf 
		int nRecv = recv(sockConn, recvBuf, 255, 0);
		if (nRecv > 0)
		{
			recvBuf[nRecv] = '\0';
			printf("%s\n", recvBuf);
		}
		
		if (strcmp(recvBuf, "88") == 0)
			closesocket(sockConn);
	}
	
	closesocket(sockServ);
}

客户端代码:

#include <Winsock2.h>
#include <stdio.h>
#include <iostream>

#pragma comment (lib, "ws2_32.lib")

using namespace std;

void main()
{
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(1, 1); //设置请求套接字1.1版本
	int err = WSAStartup(wVersionRequested, &wsaData);
	if (err != 0)
		return;

	//检查是否是1.1版本 不是返回
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		WSACleanup();
		return;
	}

	//创建socket IPV4  socket type SOCK_STREAM  0代表默认TCP协议
	SOCKET sockConn = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN addrServ;
	addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//设置连接的地址
	addrServ.sin_family = AF_INET; //IPV4
	addrServ.sin_port = htons(6000); //设置连接的端口号
	

	while(1)
	{
		//连接设置的服务器
		connect(sockConn, (SOCKADDR *)&addrServ, sizeof(SOCKADDR));
		char recvBuf[255] ="\0";
		//接受服务器发来的数据
		recv(sockConn, recvBuf, 255, 0);
		if (strcmp(recvBuf, "") != 0 )
			cout << recvBuf << endl;

		char sendBuf[255];
		cin >> sendBuf ;
		//向服务器发送数据
		send(sockConn, sendBuf, strlen(sendBuf), 0);
		sendBuf[strlen(sendBuf)] = '\0';
		if (strcmp(sendBuf, "88") == 0 )
			break;
	}
	//关闭socket 
	closesocket(sockConn);
	//释放分配的网络资源
	WSACleanup();
}




windows socket基础

标签:

原文地址:http://blog.csdn.net/tutuboke/article/details/45799667

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!