TCP 留言板

对于TCP的通信协议的原理,我不多说。网络上太多了,我也只是一个小菜。这里我贡献一下我那弱弱的代码!希望各位大神给予指点!

客服端:

#pragma warning(disable:4996)
#include "winsock2.h"
#include <iostream>
#include <string>

#pragma comment(lib,"WS2_32.lib")
using namespace std;


int Client_Port(char * ip)
{
	WSADATA data;
	WORD w = MAKEWORD(2,0);  //定义版本号
	::WSAStartup(w,&data);
	SOCKET s;
	char sztext[2048];
	s = ::socket(AF_INET,SOCK_STREAM,0);   //创建TCP套接字
	sockaddr_in addr;
	addr.sin_family = AF_INET;    //初始化套接字
	addr.sin_port = htons(8010);
	addr.sin_addr.S_un.S_addr = inet_addr(ip);
	
	::connect(s,(sockaddr*)&addr,sizeof(addr));  //发送到服务器

	string name;
	cout<<"名字:";
	::send(s,"名字:",sizeof("名字:"),0);
	cin>>name;
	char *name_st = new char[name.length()+2];
	strcpy(name_st,name.c_str());
	name_st[name.length()] = '\n';
	name_st[name.length() + 1] = '\0';
	::send(s,name_st,name.length()+2,0);	
	
	string content;
	cout<<"留言信息:";
	::send(s,"留言信息:",sizeof("留言信息:"),0);
	cin>>content;
	char * content_st = new char[content.length() + 1];
	strcpy(content_st,content.c_str());
	::send(s,content_st,content.length() + 1,0);

	::recv(s,sztext,sizeof(sztext),0);   //接受服务器端的信息
	std::cout<<sztext<<"\r"<<endl;

	::closesocket(s);
	::WSACleanup();
	return 0;
}


int main()
{
	std::cout<<"客服端已经启动!!!"<<endl;
	char ip[16];
	cout<<"请输入IP地址:";
	cin>>ip;
	Client_Port(ip);

	while(1);
	return 0;
}


服务器端:

// Sever_chat.cpp : 定义控制台应用程序的入口点。
//
#pragma warning(disable:4996)
#include <iostream>
#include <string>
#include <winsock2.h>
#include <conio.h>
#include <fstream>

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

using namespace std;

int Server_Side()
{
	WSADATA data;
	WORD w = MAKEWORD(2,0);
	::WSAStartup(w,&data);
	string sztext = "留言完毕!";
	SOCKET s,s1;
	s = ::socket(AF_INET,SOCK_STREAM,0); //创建套接字
	sockaddr_in addr,addr2;
	int n = sizeof(addr2);
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8010);  //端口号
	addr.sin_addr.S_un.S_addr = INADDR_ANY;  //任意地址
	::bind(s,(sockaddr*)&addr,sizeof(addr));  //绑定套接字
	::listen(s,5);
	cout<<"等待连接!"<<endl;

	s1 = ::accept(s,(sockaddr*)&addr2,&n);     //接受客服端的链接请求
	char * szText;
	szText = new char[sztext.length() + 1];
	strcpy(szText,sztext.c_str());
	if(s1 != NULL)
	{
		cout<<inet_ntoa(addr2.sin_addr)<<"已经连接上了"<<endl;
		::send(s1,szText,sztext.length()+1,0);
	}
	char ch[5] = {};
	char filename[] = "留言板.txt";
	ofstream fout(filename,ios::app);

	while(recv(s1,ch,sizeof(ch),0) > 0)
	{

		for(int i = 0;i < 5 &&ch[i] != '\0';i++)
		{
			putchar(ch[i]);
			fout<<ch[i];
		}
	}
	cout<<endl;

	::closesocket(s); 
	::closesocket(s1);
	::WSACleanup();
	
	return 0;
}

int main(void)
{
	cout<<"服务器已经启动"<<endl;
	while(true)
	{
		Server_Side();
		if(kbhit())
			{
				char ch;
				cout<<"选择是否结束服务(Y/N)?"<<endl;
				cin>>ch;
				switch (ch)
				{
				case 'Y':
				case 'y': goto loop;    //跳出循环到loop处
				default:
					break;
				}
			}
	}
	loop:           //goto跳出点
		return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值