转行不顺,写博客记录每天的学习进度,一个简单的tcp server/client程序。

       话说男怕入错行这句话真的一点没错,好歹C9本科毕业,阴差阳错进入电力行业三年,为转行程序员做了许多准备,刷了n+算法题也毫无作用,好不容易几个过了简历面的,but面试官根本不care算法题,一听没有相关项目经验基本就out了(唯一有希望的那个公司还被我自己搞砸),感觉信心有点受打击,写博客鼓励自己一下,也方便自己复习,fighting!

       既然没有项目经验,先从网络编程练习起来吧,用visual对照写了一个简单的server程序和client程序。

server:单线程循环运行,遇client发送exit退出。

代码如下:

//server_socker
#include<iostream>
#include<WinSock2.h>
#define PORT 65432
#pragma comment (lib,"ws2_32.lib")
using namespace std;
int main(int argc, char **argv)
{
	SOCKET sock_server, newsock;
	struct sockaddr_in addr;
	struct sockaddr_in client_addr;                 //客户端地址
	char msgbuffer[256];  //接收来自客户端信息的缓存
	char msg[] = "Connect succeed. \n";//发送给客户端

	/*初始化winsock2.dll*/
	WSADATA wsaData;
	WORD wVersionRequested = MAKEWORD(2, 2);//	高位为副版本号,地位
	if (WSAStartup(wVersionRequested, &wsaData) != 0)
	{
		cout << "加载winsock.dll 失败!\n";
		return 0;
	}

	/*创建套接字*/
	if ((sock_server = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR)
	{
		cout << "创建套接字失败!错误代码=:" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}

	/*创建bind()绑定监听地址等*/
	int addr_len = sizeof(struct sockaddr_in);
	memset((void*)&addr, 0, addr_len);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(PORT);                         //htons 将16位的无符号短整数由主机字节转换为网络字节顺序
	addr.sin_addr.s_addr = htonl(INADDR_ANY);            //允许本机所有地址,0.0.0.0
	if(bind(sock_server,(struct  sockaddr*)&addr,sizeof(addr))!=0)
	{
		cout << "地址绑定失败!错误代码:" << WSAGetLastError() << endl;
		closesocket(sock_server);
		WSACleanup();
		return 0;
	}
	/*创建listen()*/
	if (listen(sock_server, 0) != 0)
	{
		cout << "listen 函数调用失败!错误代码:" << WSAGetLastError() << endl;
		closesocket(sock_server);
		WSACleanup();
		return 0;
	}
	else
	{
		cout << "listening.............\n";
	}

	int size;
	while (true)
	{	
		/*accept()*/
		if ((newsock = accept(sock_server, (struct sockaddr*)&client_addr, &addr_len)) == INVALID_SOCKET)
		{
			cout << "accept函数调用失败!错误代码:" << WSAGetLastError() << endl;
			break;
		}
		else
			cout << "成功接受一个连接请求\n";

		/*成功接受一个链接后先发送信息,在接受信息*/
		size = send(newsock, msg, sizeof(msg), 0);
		if (size == SOCKET_ERROR)
		{
			cout << "发送信息失败!错误代码:" << WSAGetLastError() << endl;
			closesocket(newsock);
			continue;
		}
		else if (size == 0)
		{
			cout << "对方已关闭连接!\n";
			closesocket(newsock);
			continue;
		}
		else
		{
			cout << "信息发送成功! \n";
		}
		/*接收信息*/
		if ((size = recv(newsock, msgbuffer, sizeof(msgbuffer), 0)) < 0)
		{
			cout << "接受信息失败!错误代码:" << WSAGetLastError() << endl;
			closesocket(newsock);
			continue;
		}
		else if (size == 0)
		{
			cout << "对方已关闭连接!\n";
			closesocket(newsock);
			continue;
		}
		else
		{
			if (strcmp(msgbuffer, "exit")==0)
				break;
			cout << "收到的信息为:" << msgbuffer << endl;
		}
			
		closesocket(newsock);
	}
	/*结束处理*/
	closesocket(sock_server);
	WSACleanup();
	return 0;
	
	/*关闭套接字*/


}
client:发送一次后推出
//client
#include<iostream>
#include<winsock2.h>
#define PORT 65432
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main(int argc, char **argv)
{
	int sock_client;                                    //客户端套接字
	struct sockaddr_in server_addr;                     //存放服务器地址的变量
	int addr_len = sizeof(struct sockaddr_in);         //服务器地址长度
	char msgbuffer[1000];                             //定义缓冲区
													  /*初始化WSAData*/
	WSADATA wsadata;
	WORD wVersionRequested = MAKEWORD(2, 2);
	if (WSAStartup(wVersionRequested, &wsadata) != 0)
	{
		cout << "加载winsock失败! \n";
		return 0;
	}
	if ((sock_client = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		cout << "创建套接字失败! \n" << WSAGetLastError() << endl;
		WSACleanup();
		return 0;
	}
	/*填写服务器地址*/
	char IP[20];
	cout << "输入服务器地址" << endl;
	cin >> IP;
	memset((void*)&server_addr, 0, addr_len);
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(PORT);
	server_addr.sin_addr.s_addr = inet_addr(IP);//这是一个比较老的函数,如果使用visual 较高版本运行,用新函数或者在设置中关闭SDL检查
	/*与服务器建立连接*/
	if (connect(sock_client, (struct sockaddr*)&server_addr, addr_len) != 0)
	{
		cout << "连接失败!错误代码:" << WSAGetLastError() << endl;
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	/*接受消息并显示*/
	int size;
	if ((size = recv(sock_client, msgbuffer, sizeof(msgbuffer), 0) )< 0)
	{
		cout << "接受消息失败!错误代码:" << WSAGetLastError() << endl;
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	else if (size == 0)
	{
		cout << "对方已关闭连接" << endl;
		closesocket(sock_client);
		WSACleanup();
		return 0;
	}
	else
		cout << "this message from server :" << msgbuffer << endl;
	/*发送数据*/
	cout << "输入数据" << msgbuffer << endl;
	cin >> msgbuffer;
	if ((size = send(sock_client, msgbuffer, sizeof(msgbuffer), 0))<0)
		cout << "发送信息失败!错误代码:" << WSAGetLastError() << endl;
	else if (size == 0)
		cout << "对方已关闭连接!\n";
	else
		cout << "信息发送成功! \n";


	closesocket(sock_client);
	WSACleanup();
	//Sleep(10000);
	return 0;
}
运行结果如下

client

server


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值