网络编程之简单网络通信
2014-04-11 10:48
295 查看
网络编程之简单网络通信
基于控制台的简单网络编程代码。
服务器代码:
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
// Sever.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsadata;
//第一个参数指明程序请求的Socket版本,第二个参数指向WSADATA数据结构的指针,用来接受windows sockets实现的细节
//当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中
//以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
//一旦应用程序或者DLL进行了一次成功的WSAStartup()调用,它就可以继续进行其它所需的windows Socket API调用。当它完成了使用
//该Windows Socket DLL的服务后,应用程序或DLL必须调用WSAClearup()以允许Windows Socket DLL释放任何该应用程序的资源。
WSAStartup(0x0202,&wsadata);
//第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET
//第二个参数指定要创建的套接字类型,流套接字类型为SOCKT_STREAM
//第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在internet通讯域中,
//此参数一般取值为0,系统会根据套接字的类型决定使用的传输层协议
SOCKET ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//struct sockaddr是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind(),connect()等函数
//调用;struct sockaddr_in 中的in表示internet,就是网络地址。
sockaddr_in ListenAddr;
memset(&ListenAddr,0,sizeof(sockaddr_in));
//sin_family指代协议族,在socket编程中只能是AF_INET
ListenAddr.sin_family=AF_INET;
//sin_port存储端口号
ListenAddr.sin_port=htons(7070);
//sin_addr存储IP地址,使用in_addr这个数据结构
ListenAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//bind函数用于将套接字绑定到一个已知的地址上
//函数原型int bind(SCOKET socket,const struct sockaddr* address,socklen_t address_len);
bind(ListenSocket,(sockaddr *)&ListenAddr,sizeof(sockaddr));
//listen函数使主动链接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。
//在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接
listen(ListenSocket,5);
SOCKET ClientSocket=0;
sockaddr_in ClientAddr;
int ClientAddrLeng;
printf("服务器启动成功!\n");
REACCEPT:
ClientSocket=0;
ClientAddrLeng=sizeof(sockaddr_in);
memset(&ClientAddr,0,sizeof(sockaddr_in));
//对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。
//它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了
ClientSocket=accept(ListenSocket,(sockaddr *)&ClientAddr,&ClientAddrLeng);
if(ClientSocket==INVALID_SOCKET)
{
printf("客户接连失败,尝试再试连接!\n");
closesocket(ClientSocket);
goto REACCEPT;
}
else
{
printf("[%d]客户接连成功!\n",ClientSocket);
}
char Buffer[999];
int RecvNum=0;
while(1)
{
//不论是客户端还是服务器应用程序都用recv函数来向TCP连接的另一端接收数据
//第一个参数指定接受另一端套接字描述符
//第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接受到的数据
//第三个参数指明buf的长度
//第四个参数一般置为0
RecvNum=recv(ClientSocket,Buffer,999,0);
if((RecvNum==0)||(RecvNum==SOCKET_ERROR))
{
printf("[%d]客户断开连接或异常中断!\n",ClientSocket);
break;
}
else
{
printf("%s\n",Buffer);
//不论是客户端还是服务器应用程序都用send函数来向TCP连接的另一端发送数据
//客户端程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答
send(ClientSocket,Buffer,RecvNum,0);
}
}
closesocket(ClientSocket);
closesocket(ListenSocket);
WSACleanup();
return 0;
}
// Sever.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #pragma comment(lib,"Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsadata; //第一个参数指明程序请求的Socket版本,第二个参数指向WSADATA数据结构的指针,用来接受windows sockets实现的细节 //当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中 //以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。 //一旦应用程序或者DLL进行了一次成功的WSAStartup()调用,它就可以继续进行其它所需的windows Socket API调用。当它完成了使用 //该Windows Socket DLL的服务后,应用程序或DLL必须调用WSAClearup()以允许Windows Socket DLL释放任何该应用程序的资源。 WSAStartup(0x0202,&wsadata); //第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET //第二个参数指定要创建的套接字类型,流套接字类型为SOCKT_STREAM //第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在internet通讯域中, //此参数一般取值为0,系统会根据套接字的类型决定使用的传输层协议 SOCKET ListenSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //struct sockaddr是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind(),connect()等函数 //调用;struct sockaddr_in 中的in表示internet,就是网络地址。 sockaddr_in ListenAddr; memset(&ListenAddr,0,sizeof(sockaddr_in)); //sin_family指代协议族,在socket编程中只能是AF_INET ListenAddr.sin_family=AF_INET; //sin_port存储端口号 ListenAddr.sin_port=htons(7070); //sin_addr存储IP地址,使用in_addr这个数据结构 ListenAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //bind函数用于将套接字绑定到一个已知的地址上 //函数原型int bind(SCOKET socket,const struct sockaddr* address,socklen_t address_len); bind(ListenSocket,(sockaddr *)&ListenAddr,sizeof(sockaddr)); //listen函数使主动链接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。 //在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接 listen(ListenSocket,5); SOCKET ClientSocket=0; sockaddr_in ClientAddr; int ClientAddrLeng; printf("服务器启动成功!\n"); REACCEPT: ClientSocket=0; ClientAddrLeng=sizeof(sockaddr_in); memset(&ClientAddr,0,sizeof(sockaddr_in)); //对于服务器编程中最重要的一步等待并接受客户的连接,那么这一步在编程中如何完成,accept函数就是完成这一步的。 //它从内核中取出已经建立的客户连接,然后把这个已经建立的连接返回给用户程序,此时用户程序就可以与自己的客户进行点到点的通信了 ClientSocket=accept(ListenSocket,(sockaddr *)&ClientAddr,&ClientAddrLeng); if(ClientSocket==INVALID_SOCKET) { printf("客户接连失败,尝试再试连接!\n"); closesocket(ClientSocket); goto REACCEPT; } else { printf("[%d]客户接连成功!\n",ClientSocket); } char Buffer[999]; int RecvNum=0; while(1) { //不论是客户端还是服务器应用程序都用recv函数来向TCP连接的另一端接收数据 //第一个参数指定接受另一端套接字描述符 //第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接受到的数据 //第三个参数指明buf的长度 //第四个参数一般置为0 RecvNum=recv(ClientSocket,Buffer,999,0); if((RecvNum==0)||(RecvNum==SOCKET_ERROR)) { printf("[%d]客户断开连接或异常中断!\n",ClientSocket); break; } else { printf("%s\n",Buffer); //不论是客户端还是服务器应用程序都用send函数来向TCP连接的另一端发送数据 //客户端程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答 send(ClientSocket,Buffer,RecvNum,0); } } closesocket(ClientSocket); closesocket(ListenSocket); WSACleanup(); return 0; }
客户端代码:
[cpp]
view plaincopyprint?
![](https://code.csdn.net/assets/CODE_ico.png)
// Cllient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsadata;
WSAStartup(0x0202,&wsadata);
SOCKET SeverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in SeverAddr;
memset(&SeverAddr,0,sizeof(sockaddr_in));
SeverAddr.sin_family=AF_INET;
SeverAddr.sin_port=htons(7070);
SeverAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
int r=connect(SeverSocket,(sockaddr *)&SeverAddr,sizeof(sockaddr));
if(r==0)
{
printf("连接服务器成功!\n");
}
else
{
printf("连接服务器失败!\n");
goto EXIT;
}
char Buffer[999];
int RecvNum=0;
while(1)
{
scanf("%s",Buffer);
if(strcmp(Buffer,"x")==0)
{
break;
}
send(SeverSocket,Buffer,strlen(Buffer)+1,0);
RecvNum=recv(SeverSocket,Buffer,999,0);
if((RecvNum==0)||(RecvNum==SOCKET_ERROR))
{
printf("服务器断开连接或连接异常断开\n");
break;
}
else
{
printf("%s\n",Buffer);
}
}
EXIT:
closesocket(SeverSocket);
WSACleanup();
getchar();
return 0;
}
相关文章推荐
- java例程练习(网络编程[简单UDP通信试验])
- java 网络编程之UDP通信和简单的群聊程序
- linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)
- 【网络编程】使用流式套接字实现简单的客户端/服务端通信过程
- java例程练习(网络编程[简单UDP通信试验])
- Android网络通信----1.Socket编程之简单客户端与服务器端通信
- Python网络编程-主机-虚拟机之间TCP协议简单通信实例
- java 网络编程之TCP通信和简单的文件上传功能
- Android网络编程之TCP通信----简单客户端与服务端通信
- Android网络编程之Socket通信实现简单聊天室
- 网络编程 笔记(二) 基于 Windows简单通信
- Linux网络编程 - TCP Socket 简单练习:新进程辅助通信
- C# 网络编程(1)——C# 简单实现局域网内通信
- Android网络编程之UDP通信----简单客户端与服务端通信
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- Windows网络编程入门:简单的客户端和服务器通信程序调试
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 简单TCP Socket 通信
- C#网络编程TCP通信实例程序简单设计
- Windows网络编程入门:简单的客户端和服务器通信程序调试