服务端:
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
#include <windows.h>
//=========基于TCP聊天程序=====
//服务器端
void main()
{
//加载WinSock库
//定义一个WORD类型的变量
WORD wVersionRequested;
WSADATA wsaData;
int err;
//使用MAKEWORD的宏去请求一个1.1版本的WinSock
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
//如果返回值不等于0,程序退出
return;
}
//判断一下返回的版本号低位值和高位值
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
//如果不是请求的winsock版本,程序调用WSACleanup函数终
//止对winsock库的使用,然后返回
WSACleanup( );
return;
}
//创建socket
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格式
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(8200);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
//设置监听的最大连接数为5
listen(socSrv, 5);
char sendBuf[100];//发送信息
char recvBuf[100];//接收信息
char tempBuf[100];//存放中间数据
//定义用来接收客户端Socket的结构体
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
//创建socket
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKET socCmd = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址结构体的创建
SOCKADDR_IN addrSrvCmd;
addrSrvCmd.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格式
addrSrvCmd.sin_family = AF_INET;//指定地址簇
addrSrvCmd.sin_port = htons(8201);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socCmd, (SOCKADDR*)&addrSrvCmd, sizeof(SOCKADDR));
//设置监听的最大连接数为5
listen(socCmd, 5);
char cmdsendBuf[100];//发送信息
char cmdrecvBuf[100];//接收信息
char cmdtempBuf[100];//存放中间数据
//定义用来接收客户端Socket的结构体
SOCKADDR_IN addrClientcmd;
int len1 = sizeof(SOCKADDR);
//循环等待接受客户端发送请求
while (1)
{
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
//接收数据
SOCKET sockConncmd = accept(socCmd, (SOCKADDR*)&addrClientcmd, &len1);
recv(sockConn, tempBuf, 100, 0);
recv(sockConncmd,cmdtempBuf,100,0);
if ('q' != tempBuf[0])
{
//如果不是q,表示是收到的数据
sprintf(recvBuf, "%s say: %s", inet_ntoa(addrClient.sin_addr), tempBuf);
//打印输出
printf("%s\n", recvBuf);
printf("please input your data:\n");
//获取数据,得到一行数据
}
else
{
//如果是q,表示要退出,发送一个q
printf("%s request to quit the chat platform", inet_ntoa(addrClient.sin_addr));
break;
}
if ('q' != cmdtempBuf[0])
{
//如果不是q,表示是收到的数据
sprintf(cmdrecvBuf, "%s say: %s", inet_ntoa(addrClientcmd.sin_addr), cmdtempBuf);
//打印输出
printf("%s\n", cmdrecvBuf);
printf("please input your data:\n");
//获取数据,得到一行数据
gets(cmdsendBuf);
//发送数据
}
else
{
//如果是q,表示要退出,发送一个q
printf("%s request to quit the chat platform", inet_ntoa(addrClientcmd.sin_addr));
break;
}
}
closesocket(socSrv);
closesocket(socCmd);
WSACleanup();
}
客户端:
#include <Winsock2.h>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
//加载嵌套字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested=MAKEWORD(2,2);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
return;
}
if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){
WSACleanup();
return;
}
//创建用于监听的嵌套字
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family=AF_INET;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.105");
addrSrv.sin_port=htons(8200);
//向服务器发送请求
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//接收数据
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
//创建用于监听的嵌套字
SOCKET sockClientCmd=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrvCmd;
addrSrvCmd.sin_family=AF_INET;
addrSrvCmd.sin_addr.S_un.S_addr=inet_addr("192.168.0.105");
addrSrvCmd.sin_port=htons(8201);
//向服务器发送请求
connect(sockClientCmd,(SOCKADDR*)&addrSrvCmd,sizeof(SOCKADDR));
//接收数据
send(sockClientCmd,"This is command",strlen("This is command")+1,0);
closesocket(sockClient);
closesocket(sockClientCmd);
WSACleanup();
}