TCP客户端与服务器的实现
为了更容易理解,我们举一个小例子来说明服务器与客户端之间的连接过程。
有一个饭店,饭店里有服务员,服务员用于招待客人
特别要注意的是:要记住相关函数的各个参数都是什么,什么时候返回SOCKET_ERROR,什么时候返回INVALID_SOCKET
服务器
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") int main()
{
//初始化wsa
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{ printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{ printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); SOCKET sever;
SOCKET waiter;//服务员用于招待客人
struct sockaddr_in severaddr;
struct sockaddr_in clientaddr; //创建套接字---创建饭店
sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sever==INVALID_SOCKET)
{
WSACleanup();
return ;
}
/*if(sever=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
{
WSACleanup();
return 1;
}*///这么写会导致绑定失败??
//绑定---相当于拉客,把客人拉进屋子
severaddr.sin_family=AF_INET;
severaddr.sin_port=htons();
severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1"); if(bind(sever,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR)
{
WSACleanup();
closesocket(sever);
return ;
}
//监听----看客人有没有要点餐的
if(listen(sever,)==SOCKET_ERROR)
{
WSACleanup();
return ;
}
printf("等待连接...\n");
int clientlen=sizeof(clientaddr);
//接收
waiter=accept(sever,(SOCKADDR*)&clientaddr,&clientlen);//如果有要点餐的,派一个服务员去,将客户的地址信息传给店长
if(waiter==INVALID_SOCKET)//第一个参数为监听套接字
{
printf("接受失败\n");
WSACleanup();
closesocket(sever);
return ;
}
while()
{
char recvbuf[]={};//接受缓冲区
char sendbuf[]={};//发送缓冲区
if(recv(waiter,recvbuf,sizeof(recvbuf),)==SOCKET_ERROR)//服务员去负责收客户信息
{ //waiter去收
printf("接受数据失败\n");
}
printf("%s\n",recvbuf);
scanf("%s",sendbuf);
send(waiter,(char *)sendbuf,sizeof(sendbuf),);//waiter去send
}
WSACleanup();
closesocket(sever);
closesocket(waiter);
return ;
}
客户端
#include<iostream>
#include <winsock2.h> using namespace std;
#pragma comment(lib, "ws2_32.lib") int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(, ); err = WSAStartup(wVersionRequested, &wsaData);
if (err != )
{ printf("WSAStartup failed with error: %d\n", err);
return ;
} if (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )
{ printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return ;
}
else
printf("The Winsock 2.2 dll was found okay\n"); //创建socket
SOCKET sockClient=socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP );
if(INVALID_SOCKET ==sockClient)
{
WSACleanup();
return ;
}
//连接服务器
sockaddr_in severaddr;
severaddr.sin_family=AF_INET;
severaddr.sin_port=htons();
severaddr.sin_addr.S_un.S_addr=inet_addr("192.168.202.1");
if(connect(sockClient,(const sockaddr*)&severaddr,sizeof(severaddr))==SOCKET_ERROR)
{//客户端去连,连接服务器地址
WSACleanup();
closesocket(sockClient);
return ;
}
while()
{
char szbuf[]={};
cin>>szbuf;
send(sockClient,szbuf,sizeof(szbuf),);//客户端发送
int nReNum=recv(sockClient,szbuf,sizeof(szbuf),);//客户端接收
if( nReNum>)
{
cout<<szbuf<<endl;
}
}
WSACleanup();
closesocket(sockClient);
return ;
}
TCP客户端与服务器的实现的更多相关文章
- [JAVA] Tcp客户端和服务器简单代码
服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...
- Java实验四 TCP客户端和服务器的应用
实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B ...
- TCP客户端和服务器间传输数据遇到的TypeError: a bytes-like object is required, not 'str'问题
使用python实现python核心编程3第472页和474页的TCP时间戳服务器和客户端服务器间数据传输编程时遇到TypeError: a bytes-like object is required ...
- Socket TCP客户端和服务器的实现
import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...
- tcp客户端从服务器下载文本文件
代码讲解: server import socket def send_file_client(new_client_socket, new_client_addr): # 接收客户端需要下载的文件名 ...
- 基于Qt的tcp客户端和服务器实现摄像头帧数据处理(客户端部分)
项目简述 实现客户端调用摄像头,并以帧的形式将每一帧传输到服务端,服务端将图片进行某些处理后再返回给客户端.(客户端与服务端通信代码部分参考<Qt5 开发及实例>) 项目步骤 客户端的编写 ...
- --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能
PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...
- unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理
第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: , &statloc, WNOH ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
随机推荐
- Js基础知识7-Es6新增对象Map和set数据结构
前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...
- java网络基础知识的简述
TCP/UDP的介绍 TCP协议:面向连接的,字节流无差错地传输协议. UDP协议:一个不可靠的无连接的数据传输协议. 说明:TCP可以想象成电话通讯,双方在通话时必须建立连接,一方没听清,会要求对方 ...
- 各种语言中的可变参数(java、python、c++、javascript)
索引: java python c++ js 1.Java public class Animal { // 接受可变参数的方法 void eat(String... Objects) { for ( ...
- spring MVC @Resource不支持Lazy加载及解决方法
今天迁一系统时发现有个bean使用@Resource注入了另外一个bean,这个被注入的bean是将被deprecated的类,而且只有一两个功能使用到,为了先调整进行测试,增加了@Lazy注解,启动 ...
- 20145318《网络对抗》MSF基础应用
20145318 <网络对抗> MSF基础应用 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067;(2)一 ...
- 在Windows下搭建Android开发环境及遇到的问题
转载1:http://www.cnblogs.com/xdp-gacl/p/4322165.html 转载2:http://www.cnblogs.com/zoupeiyang/p/4034517.h ...
- 格式化输出%与format
一.%的用法 1.1整数输出 %o —— oct 八进制 : %d —— dec 十进制 : %x —— hex 十六进制 >>> print('%o' % 20) 24 >& ...
- luogu P1880石子归并
石子归并 luogu1880 传送门 noi1995 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得 ...
- SpringBoot添加自定义消息转换器
首先我们需要明白一个概念:springboot中很多配置都是使用了条件注解进行判断一个配置或者引入的类是否在容器中存在,如果存在会如何,如果不存在会如何. 也就是说,有些配置会在springboot中 ...
- vs2010中自动给函数或者类加上注释宏模板
Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...