为了更容易理解,我们举一个小例子来说明服务器与客户端之间的连接过程。

有一个饭店,饭店里有服务员,服务员用于招待客人

特别要注意的是:要记住相关函数的各个参数都是什么,什么时候返回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客户端与服务器的实现的更多相关文章

  1. [JAVA] Tcp客户端和服务器简单代码

    服务器: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; im ...

  2. Java实验四 TCP客户端和服务器的应用

    实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全 4.对通信内容进行摘要计算并验证 实验步骤 1.信息安全传送: 发送方A——————>接收方B A加密时,用B ...

  3. TCP客户端和服务器间传输数据遇到的TypeError: a bytes-like object is required, not 'str'问题

    使用python实现python核心编程3第472页和474页的TCP时间戳服务器和客户端服务器间数据传输编程时遇到TypeError: a bytes-like object is required ...

  4. Socket TCP客户端和服务器的实现

    import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...

  5. tcp客户端从服务器下载文本文件

    代码讲解: server import socket def send_file_client(new_client_socket, new_client_addr): # 接收客户端需要下载的文件名 ...

  6. 基于Qt的tcp客户端和服务器实现摄像头帧数据处理(客户端部分)

    项目简述 实现客户端调用摄像头,并以帧的形式将每一帧传输到服务端,服务端将图片进行某些处理后再返回给客户端.(客户端与服务端通信代码部分参考<Qt5 开发及实例>) 项目步骤 客户端的编写 ...

  7. --系统编程-网络-tcp客户端服务器编程模型、socket、htons、inet_ntop等各API详解、使用telnet测试基本服务器功能

    PART1 基础知识 1. 字节序 网络字节序是大端字节序(低地址存放更高位的字节), 所以,对于字节序为小端的机器需要收发网络数据的场景,要对这些数据进行字节序转换. 字节序转换函数,常用的有四个: ...

  8. unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理

    第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现.信号处理函数中核心的一句是: , &statloc, WNOH ...

  9. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

随机推荐

  1. 干货:Java并发编程系列之synchronized(一)

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  2. Python入门之os.walk()方法

    os.walk方法,主要用来遍历一个目录内各个子目录和子文件. os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元 ...

  3. Mysql截取和拆分字符串函数用法

    Mysql截取和拆分字符串函数用法 截取字符串函数: SUBSTRING(commentid,9) 意思是:从第9个字符开始截取到最后.SUBSTRING的参数有三个,最后一个是截取的长度,默认是到结 ...

  4. C_Learning (1)

    /数据类型及占用字节 char   1个字节{-128~127} int    2.4个字节,取决于平台是16位还是32位机子{-65536~65535} short int  2个字节{-32768 ...

  5. CodeForces 471D MUH and Cube Walls -KMP

    Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of ...

  6. VC中GetLastError()获取错误信息的使用,以及错误代码的含义

    转载:http://www.seacha.com/article.php/knowledge/windows/mfc/2011/0423/335.html VC中GetLastError()获取错误信 ...

  7. Log4j将不同Package的日志输出到不同的文件的方法

    随着项目规模的越来越大,会不断的引入新的模块,不同的模块都会打印自己的日志,最后就造成日志根本没法查看,比如我自己的项目中,就存在以下这些日志: 接收外界消息的日志.对外发送消息的日志: 后台常驻线程 ...

  8. python程序转为exe文件

    python开发者向普通windows用户分享程序,要给程序加图形化的界面(传送门:这可能是最好玩的python GUI入门实例! http://www.jianshu.com/p/8abcf73ad ...

  9. 星系炸弹|2015年蓝桥杯B组题解析第二题-fishers

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

  10. 【集群搭建】Zookeeper集群环境配置

    1.下载解压安装文件 2.配置文件:conf/zoo.cfg tickTime=2000 dataDir=/usr/sunny/logs/zookeeper/data dataLogDir=/usr/ ...