基于socket的简单网络程序设计
2014-05-20 21:45
351 查看
基于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”,点击【确定】
2)Winsock的初始化
在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)编译运行,并尝试nTcpServer与nTcpClient进行通信
7)创建工程nUdpClient与nUdpServer
//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)编译运行nUdpClient与nUdpServer,并尝试在它们之间进行通信
相关文章推荐
- Linux 下基于socket的简单网络聊天室
- Socket网络程序设计(2) ———— 基于UDP协议的客户-服务器socket实例
- 基于TCP Socket的简单网络通信
- Linux 下基于socket的简单网络聊天室(服务器与客户端)
- 基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)
- 基于tcp/ip协议的Socket网络通讯 --> 简单的数据传送和库构造
- 网络编程与多线程的应用--基于socket udp编写一个简单聊天程序
- Socket网络程序设计(1) ———— 基于TCP协议的客户-服务器socket实例
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- 一只简单的网络爬虫(基于linux C/C++)————socket相关及HTTP
- 基于Linux系统的Socket编程简单介绍
- Flex与.NET互操作(一):基于Socket的网络连接
- 简单的 C++ SOCKET编程 ---基于TCP/IP协议
- java基于TCP的socket编程简单实现[代码实践过]
- 基于wince的网络音视频通信(简单易明版)
- Flex与.NET互操作(一):基于Socket的网络连接
- 基于socket的简单通讯
- 基于wince的网络音视频通信(简单易明版)
- Flex与.NET互操作(一):基于Socket的网络连接 推荐
- 基于Socket的Java网络编程集粹