由于代码的注释已经很详尽了,所以这里不再作过多说明.仅仅贴出代码和结果图.

值得注意的是必须先启动server程序再启动client.

Server:

 #include <WINSOCK2.H>    //套接字库
#include <stdio.h> #define PORT 6000 //服务器端口
#define MSGSIZE 1024 //收发缓冲区的大小 #pragma comment(lib, "ws2_32.lib") //链接静态库 DWORD WINAPI FunThread(LPVOID); //创建一个线程,专门用来接收数据 SOCKET sClient; //连接所用套节字
SOCKET sListen; //监听套接字
SOCKADDR_IN client; //保存客户的地址信息
int iaddrSize = sizeof(SOCKADDR_IN); int main()
{ WSADATA wsaData; //WSADATA结构体中主要包含了系统所支持的Winsock版本信息
SOCKADDR_IN local; //定义本地套接字地址
char s_Message[MSGSIZE]; //收发缓冲区 WSAStartup(0x0202, &wsaData); //初始化套接字库 sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器监听套节字。TCP协议 local.sin_family = AF_INET; //AF_INET指明使用TCP/IP协议族
local.sin_port = htons(PORT);//指明连接服务器的端口号
local.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取本机地址 bind(sListen, (struct sockaddr *)&local, sizeof(SOCKADDR_IN));//地址绑定到套接字 listen(sListen, );//开始监听 sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//建立连接,返回用于连接的套接字
printf("Accepte client:%s:%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));//输出客户端的IP地址和端口 HANDLE hThread=CreateThread(NULL,,FunThread,,,);//运行至此创建专门的接收线程用于接收客户端发送
//的数据,在监听主线程上创建一个新的数据接收线程
CloseHandle(hThread);//关闭线程句柄 //用于从服务器端向客户端发送数据
while (TRUE)
{
printf("Server Send:");
//从键盘输入
gets(s_Message);
//发送数据
send(sClient, s_Message, strlen(s_Message), );
}
return ;
} //当接收数据时调用此线程函数
DWORD WINAPI FunThread(LPVOID)
{
char c_Message[MSGSIZE]; //接收数据缓冲区
int ret; //接收字节的个数
while (TRUE)
{
ret = recv(sClient, c_Message, MSGSIZE, );//接收数据到缓冲区 //判断是否成功接收,如果未成功接收则重启监听,将原缓冲区的数据归零
if(ret==SOCKET_ERROR)
{
printf("\nclient is closed!"); sClient = accept(sListen, (struct sockaddr *)&client, &iaddrSize);//重新开始监听
printf("\nAccepte new client:%s:%d", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
memset(c_Message,,);//将原来的client message归零
continue;
}
c_Message[ret] = '\0';
printf("\nReceived: %s\n", c_Message);
}
return ;
}<strong>
</strong>

Client:

 #include <WINSOCK2.H> //套接字库
#include <stdio.h> #define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址,由于服务也在本地机器上所以用环回地址127.0.0.1 #define PORT 6000 //客户端绑定端口
#define MSGSIZE 1024 //客户端接收数据缓冲区大小
#pragma comment(lib, "ws2_32.lib") DWORD WINAPI FunThread(LPVOID); //对于客户端接收数据的线程函数 SOCKET sClient; //客户端套接字
SOCKADDR_IN server; //服务器端套接字 int main()
{
WSADATA wsaData;
char c_Message[MSGSIZE]; //数据缓冲区 WSAStartup(0x0202, &wsaData); //初始化套接字库 sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建客户端套接字 memset(&server, , sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0
server.sin_family = PF_INET; //声明地址格式是TCP/IP地址格式
server.sin_port = htons(PORT); //指明连接服务器的端口号
server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址 connect(sClient, (struct sockaddr *)&server, sizeof(SOCKADDR_IN)); //连到刚才指明的服务器上 HANDLE hThread=CreateThread(NULL,,FunThread,,,);;//客户端开辟接收数据线程
CloseHandle(hThread); //客户端向服务器发送数据
while (TRUE)
{
printf("Client Send:");
gets(c_Message); send(sClient, c_Message, strlen(c_Message), );
if(!strcmp(c_Message,"exit"))//client自身退出
exit();
} // 释放连接和进行结束工作
closesocket(sClient);
WSACleanup();
return ;
} //接收线程函数
DWORD WINAPI FunThread(LPVOID)
{
char s_Message[MSGSIZE];//定义接收缓冲区
int ret;
while (TRUE)
{
ret = recv(sClient, s_Message, MSGSIZE, );//接收服务器端的数据 //判断是否接收
if(ret==SOCKET_ERROR)
{
printf("\nServer is closed!\n");
exit();
}
s_Message[ret] = '\0';
//显示接收数据
printf("\nReceived: %s\n", s_Message); //如果服务器端发送exit则client退出
if(!strcmp(s_Message,"exit"))//server让client退出
exit();
}
return ;
}<strong>
</strong>

运行结果如下:



基于TCP套接字实现的简单Demo的更多相关文章

  1. unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...

  2. Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象

    一.简单的tcp套接字通信 套接字通信的一般流程 服务端 server = socket() #创建服务器套接字 server.bind() #把地址绑定到套接字,网络地址加端口 server.lis ...

  3. Python网络编程之TCP套接字简单用法示例

    Python网络编程之TCP套接字简单用法示例 本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而jav ...

  4. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  5. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  6. TCP套接字编程

    一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...

  7. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  8. 套接字编程相关函数(2:TCP套接字编程相关函数)

    本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...

  9. LINUX TCP套接字详细配置

    提高服务器的负载能力,是一个永恒的话题.在一台服务器CPU和内存资源额定有限的情况下,最大的压榨服务器的性能,是最终的目的.要提高 Linux系统下的负载能力,可以先启用Apache的Worker模式 ...

随机推荐

  1. 2、elasticsearch 的安装和插件的安装

    1.安装Elasticsearch集群 1.下载elasticsearch-2.0.0.tar.gz,执行tar -zxvf elasticsearch-2.0.0.tar.gz解压 2.修改conf ...

  2. Unity 移动MM自签名方式

    在使用Unity接移动MM SDK的时候,最后有一个签名.  主要是把计费文件和版权文件放入APK的根目录.  搞了半天才知道前来这么简单..... 软件使用: apk签名工具apktool

  3. QUARTZ CRON

    本文来自:http://www.blogjava.net/crazycy/archive/2013/06/06/400287.html 每次使用Quartz Cron的时候都要去查manual doc ...

  4. CSS入门教程——定位(positon)

    CSS入门教程——定位(positon) CSS定位在网页布局中是起着决定性作用.   定位 CSS的定位功能是很强大的,利用它你可以做出各种各样的网页布局.本节就介绍一些CSS常用的定位语句. 1. ...

  5. python3 module中__init__.py的需要注意的地方

    网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了. 若有需要.请各位看官去搜搜即可. 最近刚开始用Python3 就遇到了这个比较有意思的事情 闲言少叙,下面要介绍的是pyt ...

  6. Oracle SQL函数之转换函数To_char汇总

    TO_CHAR(x[[,c2],C3])[功能]将日期或数据转换为char数据类型[参数]x是一个date或number数据类型.c2为格式参数c3为NLS设置参数如果x为日期nlsparm=NLS_ ...

  7. select count(distinct a)

    我想对一个表里面字段a的个数进行进行统计,因为字段a有重复的记录,我想排除重复的记录,该sql语句为: select count(distinct a) 链接:http://www.w3school. ...

  8. Spring 注入数据源

    一.在项目中添加dataSource所用到的包 dbcp数据源所需包:     commons-dbcp.jar     commons-pool.jar C3P0数据源所需包:     c3p0-0 ...

  9. UVa 11488 - Hyper Prefix Sets

    找 前缀长度*符合该前缀的字符串数 的最大值 顺便练了一下字典树的模板 #include <iostream> #include <cstdio> #include <c ...

  10. 从汇编看c++内联函数评估求值

    在c++中,一个inline函数实体,在整个class 声明未被完全看到之前,是不会被评估求值的,也就是说,对于类里面内联的成员函数本身的分析,要等到class的声明完全结束之后才开始.下面试c++源 ...