基于socket的简单网络程序设计

基于socket的简单网络程序设计

1、实验目的与要求:

(1)初步掌握TCP和UDP方式的网络编程模式。

(2)能运用Winsock提供的API函数接口进行网络程序的编写。

2、实验准备和说明:

(1)要求掌握流式和数据报socket的编程模式和实现。

(2)创建本次实验工作文件夹“…\实验\实验4”。

3、实验内容与步骤:

      1)工程的创建

在VC6里边新建一个工程,选择:Win32
Console Application,输入工程名。具体方法:启动VC6.0,进入【文件】->【新建】,然后在【新建工程】的对话框中选择:Win32
Console Application,输入一个工程名ntTcpClient及保存路径“…\实验\实验4”,点击【确定】

2Winsock的初始化

在Windows环境下进行网络程序设计时,所有的Winsock函数都是从ws2_32.dll导出的,我们可以通过#pragma
comment(lib, "ws2_32.lib")语句链接到该库文件。但在使用Winsock函数之前还必须调用WSAStartup函数对库资源进行初始化工作,使用完毕后,在退出程序之前,我们还必须调用WSACleanup函数来释放库资源。

3)新建文件ntTcpClient.cpp

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include "winsock2.h"

//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define PORT  8888
#define ADDR  "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA	wsock;
	SOCKET sconnection;
	SOCKADDR_IN          serAddr;
	int                  nRet=0;
	char                 buf[100];

	//初始化Winsock 2.2

	printf("\nInitialising Winsock...\n");
	if (WSAStartup(MAKEWORD(2,2),&wsock) != 0)
	{
		fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
        exit(0);
	}
	printf("Initialised successfully.\n");

	//创建监听Socket
	printf("\nCreating TCP Socket...\n");
	if ((sconnection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
		== INVALID_SOCKET)
	{
		printf("Creation of socket failed %d\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
	printf("TCP Socket Created successfully.\n");
	//设置OCKADDR_IN地址结构
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(PORT);
	//serAddr.sin_addr.s_addr = INADDR_ANY;
	serAddr.sin_addr.s_addr = inet_addr(ADDR);
	//连接服务端
	printf("Connecting to %s:%d...\n",
		inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port));
	if (connect(sconnection, (SOCKADDR *) &serAddr, sizeof(serAddr))
		== SOCKET_ERROR)
	{
		printf("connection failed with error %d\n", WSAGetLastError());
		closesocket(sconnection);
		WSACleanup();
		return 0;
	}
	printf("connection successfully.\n");
	printf("Trying to send  messages.\n");
	//收发处理
	for(int i=0;;i++)
	{
		memset(buf,0,sizeof(buf));
		printf("\nMessage to be sent:");
		gets(buf);
		if ((nRet = send(sconnection, buf, strlen(buf), 0)) == SOCKET_ERROR)
		{
			printf("send failed with error %d\n", WSAGetLastError());
			closesocket(sconnection);
			WSACleanup();
			return 0;
		}

		printf("The  data  was sent to %s successfully.\n",inet_ntoa(serAddr.sin_addr));
		if(strncmp(buf,"exit",sizeof("exit"))==0)
			break;
		memset(buf,0,sizeof(buf));

		if ((nRet = recv(sconnection, buf, sizeof(buf), 0))
			== SOCKET_ERROR)
		{
			printf("recv failed with error %d\n", WSAGetLastError());
		}
		printf("The following data  was received from %s successfully.\n",
			inet_ntoa(serAddr.sin_addr));
		printf(buf);
	}
	printf("Closing the connection.\n");

	closesocket(sconnection);
	WSACleanup();

	return 0;
}
</span>

4)编译运行

5)重建工程ntTcpServer

#include "stdafx.h"
#include <stdlib.h>
#include "winsock2.h"

//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define PORT  8888
#define ADDR  "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA	wsock;
	SOCKET listensocket,newconnection;
	SOCKADDR_IN          serAddr,cliAddr;
	int                  cliAddrLen=sizeof(cliAddr);
	int                  nRet=0;
	char                 buf[100];

	//初始化Winsock 2.2
	printf("\nInitialising Winsock...\n");
	if (WSAStartup(MAKEWORD(2,2),&wsock) != 0)
	{
		fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
        exit(0);
	}
	printf("Initialised successfully.\n");

	//创建监听Socket
	printf("\nCreating TCP Socket...\n");
	if ((listensocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
		== INVALID_SOCKET)
	{
		printf("Creation of socket failed %d\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}
	printf("TCP Socket Created successfully.\n");
	//设置SOCKADDR_IN地址结构
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(PORT);
	//   serAddr.sin_addr.s_addr = INADDR_ANY;
	serAddr.sin_addr.s_addr = inet_addr(ADDR);
	//绑定套接字
	if (bind(listensocket, (SOCKADDR *)&serAddr,
	   sizeof(serAddr))== SOCKET_ERROR)
	{
		printf("bind failed with error %d\n", WSAGetLastError());
		closesocket(listensocket);
		WSACleanup();
		return 0;
	}

	//监听连接
	if (listen(listensocket, 5) == SOCKET_ERROR)
	{
		printf("listen failed with error %d\n", WSAGetLastError());
		closesocket(listensocket);
		WSACleanup();
		return 0;
	} 

	printf("Waiting for a connection on port %d.\n", PORT);

	//接受连接
	if ((newconnection = accept(listensocket, (SOCKADDR *) &cliAddr,
		&cliAddrLen)) == INVALID_SOCKET)
	{
		printf("accept failed with error %d\n", WSAGetLastError());
		closesocket(listensocket);
		WSACleanup();
		return 0;
	}

	printf("successfully got a connection from %s:%d.\n",
		inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port));

	//此时可以继续监听新的连接,或者停止监听进行数据收发
	closesocket(listensocket);

	printf("Waiting to receive data...\n");

	memset(buf,0,sizeof(buf));
	for(int i=0;;i++)
	{
		if ((nRet = recv(newconnection, buf, sizeof(buf), 0))
			== SOCKET_ERROR)
		{
			printf("recv failed with error %d\n", WSAGetLastError());
			closesocket(newconnection);
			WSACleanup();
			return 0;
		}
		//显示接收到的数据
		printf(buf);
		printf("\n");
		//若发现exit,则退出处理循环
		if(strncmp(buf,"exit",sizeof("exit"))==0)
		{
			printf("exit the receiving loop\n");
			break;
		}
		if((nRet = send(newconnection,buf,strlen(buf),0))
			==SOCKET_ERROR)
		{
			printf("send failed with error %d\n", WSAGetLastError());
		}
	}
	//关闭已连接套接字
	closesocket(newconnection);

	WSACleanup();
	return 0;
}

6)编译运行,并尝试nTcpServernTcpClient进行通信

7)创建工程nUdpClientnUdpServer

//nUdpServer代码
#include <stdio.h>

#include "winsock2.h"

//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define PORT  8888
#define ADDR  "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA	wsock;
	SOCKET sersocket;
	SOCKADDR_IN  serAddr;
	int   serAddrsize=sizeof(serAddr);
	int   nRet=0;
	char  buf[1024];

	//初始化Winsock 2.2
	printf("\nInitialising Winsock...\n");
	if (WSAStartup(MAKEWORD(2,2),&wsock) != 0)
	{
		fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
        exit(0);
	}
	printf("Initialised successfully.\n");

	//创建socket
	printf("\nCreating UDP Socket...\n");
	if ((sersocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))
		== INVALID_SOCKET)
	{
		printf("Creation of socket failed %d\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}

	printf("UDP Socket Created successfully.\n");

	//设置SOCKADDR_IN地址结构
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(PORT);
	//   serAddr.sin_addr.s_addr = INADDR_ANY;
	serAddr.sin_addr.s_addr = inet_addr(ADDR);
	//绑定套接字
	if (bind(sersocket, (SOCKADDR *)&serAddr,
		sizeof(serAddr))== SOCKET_ERROR)
	{
		printf("bind failed with error %d\n", WSAGetLastError());
		closesocket(sersocket);
		WSACleanup();
		return 0;
	}

	printf("Waiting to receive data...\n");

	for(int i=0;;i++)
	{
		if ((nRet = recvfrom(sersocket, buf, sizeof(buf), 0,
			(SOCKADDR *)&serAddr, &serAddrsize)) == SOCKET_ERROR)
		{
			printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError());
			closesocket(sersocket);
			WSACleanup();
			return 0;
		}
		//显示接收到的数据
		printf(buf);
		printf("\n");
		if ((nRet = sendto(sersocket, buf, strlen(buf), 0,
			(SOCKADDR *)&serAddr, sizeof(serAddr))) == SOCKET_ERROR)
		{
			printf("ERROR: sendto failed with error %d\n", WSAGetLastError());
			closesocket(sersocket);
			WSACleanup();
			return 0;
		}

		//若发现”exit”,则退出处理循环
		if(strncmp(buf,"exit",sizeof("exit"))==0)
		{
			printf("exit the receiving loop\n");
			break;
		}
	}

	//关闭套接字
	closesocket(sersocket);

	WSACleanup();
	return 0;
}
//nUdpClient代码
#include <stdio.h>
#include "winsock2.h"

//winsock 2.2 library
#pragma comment(lib,"ws2_32.lib")

#define PORT  8888
#define ADDR  "127.0.0.1"

int main(int argc, char* argv[])
{
	WSADATA	wsock;
	SOCKET clisocket;
	SOCKADDR_IN  serAddr;
	int   serAddrsize=sizeof(serAddr);
	int   nRet=0;
	char  buf[1024];

	//初始化Winsock 2.2
	printf("\nInitialising Winsock...\n");
	if (WSAStartup(MAKEWORD(2,2),&wsock) != 0)
	{
		fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()");
        exit(0);
	}
	printf("Initialised successfully.\n");

	//创建socket
	printf("\nCreating UDP Socket...\n");
	if ((clisocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))
		== INVALID_SOCKET)
	{
		printf("Creation of socket failed %d\n", WSAGetLastError());
		WSACleanup();
		return 0;
	}

	//设置SOCKADDR_IN地址结构
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(PORT);
	//   serAddr.sin_addr.s_addr = INADDR_ANY;
	serAddr.sin_addr.s_addr = inet_addr(ADDR);

	printf("UDP Socket Created successfully.\n");

	printf("Trying to send  messages.\n");
	for(int i=0;;i++)
	{
		memset(buf,0,sizeof(buf));
		printf("\nMessage to be sent:");
		gets(buf);
		if ((nRet = sendto(clisocket, buf,strlen(buf), 0,
			(SOCKADDR *)&serAddr, sizeof(serAddr))) == SOCKET_ERROR)
		{
			printf("ERROR: sendto failed with error %d\n", WSAGetLastError());
			closesocket(clisocket);
			WSACleanup();
			return 0;
		}
		printf("The  data  was sent to %s successfully.\n",inet_ntoa(serAddr.sin_addr));
		if(strncmp(buf,"exit",sizeof("exit"))==0)
			break;
		memset(buf,0,sizeof(buf));

		if ((nRet = recvfrom(clisocket, buf, sizeof(buf), 0,
			(SOCKADDR *)&serAddr, &serAddrsize)) == SOCKET_ERROR)
		{
			printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError());
			closesocket(clisocket);
			WSACleanup();
			return 0;
		}
		//显示接收到的数据
		printf("The following data  was received from %s successfully.\n",
			inet_ntoa(serAddr.sin_addr));
		printf(buf);
	}

	closesocket(clisocket);
	WSACleanup();
	return 0;
}

8)编译运行nUdpClientnUdpServer,并尝试在它们之间进行通信

基于socket的简单网络程序设计

时间: 2024-10-07 07:06:54

基于socket的简单网络程序设计的相关文章

基于Socket的java网络编程

1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的.在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程. 2.Socket通讯的过程 Server端Listen(监听)

Unity3d 封装Socket创建简单网络

北京又在打雷下大雨了,学习Unity以来,越来越感兴趣,情不自禁的想要学习更多知识 这次自己搭建一个Socket模块,比较基础,适合新手学习,详细介绍Socket的搭建过程,同样会把详细过程在代码里进行注释~ 在搭建Socket过程中,需要创建以下几个常用的方法: 1.创建套接字(socket) 2.绑定Ip和端口 3.监听方法 4.接收客户端请求的方法 5.收发消息的方法 创建SocketManger管理类 把客户端与服务端代码都写在新建的SocketManger里,并把SocketMange

基于WinPcap的简单网络编程配置

一.实验目的 1.学习和掌握基于WinPcap编程的基本方法. 2.通过监控IP包流量,了解IP协议的工作原理和IP数据包的基本结构. 二.实验内容  使用WinPcap编写一个控制台程序监控IP数据包流量,要求: ①以命令行形式运行:MonitorTraffic time 其中MonitorTraffic为程序名 三.实验步骤及实验结果 1)利用参考代码在VS2010开发工具编中写一个控制台程序 2)添加...\WpdPack\Include 项目-->**属性(alt+F7) 配置属性-->

基于Socket实现网络编程

Socket是网络上两个程序间双向通讯的一端,它既可以发送请求,也可以接收请求,利用它可以方便的编写网络上数据的传递,在java中,有专门的类类处理用户的请求和响应.利用Socket 类的方法,就可以实现两台计算机之间的通信,那么怎么利用socket进行网络编程呢?我试试水~ 网络中的进程之间是如何进行通信的? 本地进程间通信(IPC)有很多种方法,简而言之可以归结为以下四类: 消息传递(管道,FIFO,消息队列); 同步(互斥量,条件变量,读写锁,文件和写记录锁,信号量): 内存共享(匿名的和

socket --自己简单的理解

一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机. 而TCP层则提供面向应用的可靠(tcp)的或非可靠(UDP)的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构.即通信双方一方作为服务器等待客户提出请求并予以响应.客户则

【Web后端笔记】基于Socket实现的简单Web服务器搭建

我们在地址栏中输入的内容称为通用资源标记符(Universal Resource Identifier,URI)它有很多种样式,在Web中我们通常称为统一资源定位符(Uniform Resource Locator,URL)的形式,它的格式如下: 协议://主机[.端口号][绝对路径[?参数]] 在http://www.cnblogs.com/DebugLZQ/中,http表示协议名称;www.cnblogs.com表示主机的地址:可选的端口号没有出现,那么,将使用http协议默认的端口号80:

通过基于java实现的网络聊天程序分析java中网络API和Linux Socket API关系

1. 引言 socket网络编程,可以指定不同的通信协议,在这里,我们使用TCP协议实现基于java的C/S模式下“hello/hi”网络聊天程序 2. 目标 1). 通过该网络聊天程序,了解java Socket API接口的基本用法 2). java Socket API简要介绍 3). linux socket API 简单分析 4). tcp协议的连接和终止 5). 探究java socket API 和 linux socket api之间的关系 3. linux socket API

基于Java实现hello/hi简单网络聊天程序

目录 Socket简要阐述 Socket的概念 Socket原理 hello/hi的简单网络聊天程序实现 服务器端 客户端 程序执行结果 跟踪分析调用栈 & Linux API对比 创建ServerSocket 调用栈图示 源码分析 Socket绑定 调用栈图示 源码分析 Socket监听 调用栈图示 源码分析 Socket Accept 调用栈图示 源码分析 Java Socekt API与Linux Socket API 参考链接 Socket简要阐述 Socket的概念 Socket的英文

网络编程-socket实现简单套接字通信

Service import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#给予网络,机于TCP协议的通信 #端口0-65535 #0-1024给操作系统使用 phone.bind(('127.0.0.1',8080)) #开始监听,表最大挂起链接数 phone.listen(5) #等待链接 #res=phone.accept() #res是一个套接字对象和客户地址 conn,client_addr=phone.ac