winsocket的C/S模型程序

因为这学期要交winsocket的通信程序,一个字,坑。因为上课就没有教的。不过有神器在手,陆楠同学的《计算机网络实训和编程》,so,还不是手到擒来!

 

环境:win7+vs2010

项目:C++项目,有预编译头文件

 

先看效果:

服务端:

 
客户端:



 

连接后:



  
不过感觉怪怪的。


 看看client的源文件:

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

#include "stdafx.h"
#include <winsock2.h>
#include  <iostream> 
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
	const int DEFAULT_PORT = 5000; 
	WORD wVersionRequested;
	WSADATA wsaData;
	int err,iLen;
	if (argc < 2) {
		cout<<"Command:TcpEx_Client ServerIP"<<endl;
		return 0;  } 
	wVersionRequested=MAKEWORD( 2, 2 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		cout<<"加载WinSock失败!";
		return 0;  }
	SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);   //创建用于连接的套接字
	if (sockClient == INVALID_SOCKET)  {
		cout<<"socket() fail:"<<WSAGetLastError()<<endl;
		return 0;  }
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrSrv.sin_port = htons(DEFAULT_PORT); 
	err = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//请求连接服务器进程
	if ( err == INVALID_SOCKET ) {
		cout<<"connect() fail:"<<WSAGetLastError()<<endl;
		return 0;  
}
	char sendBuf[1024],hostname[100];
	if (gethostname(hostname,100) != 0)  strcpy_s(hostname,"None");   //获取主机名称
	strcpy_s(sendBuf,hostname);
	strcat_s(sendBuf," have conneted to you!");
	err = send(sockClient,sendBuf,int(strlen(sendBuf))+1,0); //发送数据
	if (err == SOCKET_ERROR)  {
		cout<<"send() fail:"<<WSAGetLastError()<<endl;
		return 0; 
}
	char recvBuf[1024];
	iLen = recv(sockClient,recvBuf,1024,0); //接收数据
	if (iLen == 0)  return 0;
	else if (iLen == SOCKET_ERROR) {
		cout<<"recv() fail:"<<WSAGetLastError()<<endl;
		return 0;  }
	else {
		recvBuf[iLen] = '\0';
		cout<<recvBuf<<endl;  
}
	closesocket(sockClient); //关闭套接字
	WSACleanup();
}

 

再看Sever:

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

#include "stdafx.h"
#include <winsock2.h>
#include  <iostream> 
#include <string.h>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[]) {
	const int DEFAULT_PORT = 5000; 
	WORD wVersionRequested;
	WSADATA wsaData;
	int err,iLen;
	wVersionRequested=MAKEWORD( 2, 2 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) {
		cout<<"加载WinSock失败!";
		return 0;
	}
	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); //创建服务器监听套接字
	if (sockSrv == INVALID_SOCKET) {
		cout<<"socket() fail:"<<WSAGetLastError()<<endl;
		return 0;
	}
	SOCKADDR_IN addrSrv;
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//自动分配地址,字节顺序转换
	addrSrv.sin_port = htons(DEFAULT_PORT);//字节顺序转换
	err = bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  //绑定本地主机IP和端口
	if ( err != 0 ) {
		cout<<"bind() fail:"<<WSAGetLastError()<<endl;
		return 0;
	}
	err = listen(sockSrv,5);	  //监听
	if ( err != 0 ) {
		cout<<"listen() fail:"<<WSAGetLastError()<<endl;
		return 0;
	}
	cout<<"Server waiting...:"<<endl;
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);
	while(1) {
		SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);//接收客户连接请求
		if (sockConn == INVALID_SOCKET) 	{
			cout<<"accept() fail:"<<WSAGetLastError()<<endl;
			break; }
		char sendBuf[1024],hostname[100];
		if (gethostname(hostname,100) != 0) //获取主机名称
			strcpy_s(hostname,"None");
		sprintf_s(sendBuf,"welcome %s connected to %s!",inet_ntoa(addrClient.sin_addr),hostname);
		err = send(sockConn,sendBuf,int(strlen(sendBuf))+1,0); //发送数据
		if (err == SOCKET_ERROR) {
			cout<<"send() fail:"<<WSAGetLastError()<<endl;
			break;  
}
		char recvBuf[1024] = "\0";
		iLen = recv(sockConn,recvBuf,1024,0);//接收数据
		if (iLen == SOCKET_ERROR)  {
			cout<<"recv() fail:"<<WSAGetLastError()<<endl;
			break;  }
		recvBuf[iLen] = '\0';
		cout<<recvBuf<<endl;
		closesocket(sockConn); //关闭套接字
	}
	closesocket(sockSrv);//关闭服务器监听套接字
	WSACleanup();
	return 0;
}

 

好吧,其实我只是把书本上的例子实现了一遍。

 

看看老师给的例子:

client:

// Client.cpp : Defines the entry point for the console application.
//

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


void main(int argc, char* argv[])
{
	SOCKET sock ;

	SOCKADDR_IN dest_sin ;

	WSADATA wsaData ;//版本参数

	int port = 344 ;

	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
		cout<<"WinSock startup Error!" ;
		return ;        
	}

	sock = socket(AF_INET, SOCK_STREAM, 0) ;

	if (sock == INVALID_SOCKET) {
		cout<<"socket() failed" ;
		closesocket(sock) ;
		return ;
	}

	dest_sin.sin_family = AF_INET ;
	dest_sin.sin_port = htons(port) ;
	dest_sin.sin_addr.s_addr = inet_addr("127.0.0.1") ;

	connect(sock, (sockaddr *)&dest_sin, sizeof(dest_sin)) ;

连续发十个数给服务器

		char szName[20] ;
		for(int i=0 ; i<20 ; i++)
		{
			sprintf(szName, " %d", i) ;
	        send(sock, szName, 20, 0) ;
		}
		

	  // send(sock, " ",0,0) ;

	   closesocket(sock) ;
		
			
		if (WSACleanup() == SOCKET_ERROR) {
			cout<<"WSACleanup() failed with error "<<WSAGetLastError() ;
		}
   
}

 

Sever:

// Server.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<WINSOCK2.H>
#include<iostream.h>
#pragma comment(lib,"ws2_32.lib")


void main(int argc, char* argv[])
{
	SOCKET sockServer ;
	SOCKET sockAccept ;

	SOCKADDR_IN local_sin ;
	SOCKADDR_IN acc_sin ;

	WSADATA wsaData ;

	int port = 344 ;

	if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
		cout<<"WinSock startup Error!" ;
		return ;
         
	}

	sockServer = socket(AF_INET, SOCK_STREAM, 0) ;
	if (sockServer == INVALID_SOCKET) {
		cout<<"socket() failed" ;
		closesocket(sockServer) ;
		return ;
	}

	local_sin.sin_port = htons(port) ;
	local_sin.sin_family = AF_INET ;
	local_sin.sin_addr.s_addr = INADDR_ANY ;

	if (bind(sockServer, (sockaddr FAR*)&local_sin, sizeof(local_sin)) == SOCKET_ERROR) {
		cout<<"bind(sock) failed "<<WSAGetLastError()<<"is the error!" ;
		return ;
	}

	cout<<"Server begin..."<<endl ;

	if (listen(sockServer, 4)) {
		cout<<"listen(sockserver) failed "<<WSAGetLastError()<<" is the error!" ;
		return ;
	}

	int acc_sin_len = sizeof(acc_sin) ;

	sockAccept = accept(sockServer, (sockaddr FAR*)&acc_sin, (int FAR*)&acc_sin_len) ;

	if (sockAccept<0) {
		cout<<"accept() failed "<<WSAGetLastError()<<" is the error!" ;
		return ;
	}



	char szName[20] ;
//
//等待接收数据
	while (1) {
		int rec = recv(sockAccept, szName, 20, 0) ;
		if( rec == 0) 
		{
			cout<<"Server stop.."<<endl ;
			break ;
		}
		else
			cout<<szName<<endl ;
		
	}

	closesocket(sockServer) ;
	closesocket(sockAccept) ;

	if (WSACleanup() == SOCKET_ERROR) {
		cout<<"WSACleanup() failed with error "<<WSAGetLastError() ;
	}
	

	


	
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值