socket套接字通信C语言示例vc6.0

4 篇文章 0 订阅
3 篇文章 0 订阅

转自:http://blog.csdn.net/xgx198831/article/details/8464552

socket套接字通信C语言示例,编程环境vc6.0



该程序用使用的面向连接(tcp/ip)的字符流套接字


程序包含两部分,一部分是通信的服务端,一部分是通信的客户端


//===============================================================================================================================


 服务器端代码 sever.cpp
///一、初始化套接字
///二、创建套接字
///三、绑定
///四、侦听
///五、接收
///六、发送
///七、销毁连接



#include <iostream>
#include <WINSOCK2.H>
//#include <cstdlib>
#pragma comment(lib,"WS2_32.lib")
using namespace std;


#define SER_PORT 5000     //
#define SER_IP "127.0.0.1"


DWORD WINAPI ThreadProcessor(LPVOID lpParameter); //接收数据的线程函数
fd_set fdRead = {0};


int main()
{
SOCKET sever;    ///定义套接字
SOCKET client;
char buf[1024];
SOCKADDR_IN ser_addr;   //服务器地址信息
SOCKADDR_IN cli_addr;    //客户端地址信息
//HANDLE hnd;   
int ret;   //用于保存函数返回值
WORD wVersionRequested;
WSADATA wsaData;
int cliAddrLen;
wVersionRequested=MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&wsaData)!=0)
{
   cout << "初始化失败!\n";
return 1;
}
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.S_un.S_addr = inet_addr(SER_IP);
ser_addr.sin_port = htons(SER_PORT);
memset(ser_addr.sin_zero,0,8);
///创建套接字
sever = socket(AF_INET,SOCK_STREAM,0);
if (sever == INVALID_SOCKET)
{
cout << "创建套接字失败!\n";
return 1;
}
//绑定
if(bind(sever, (SOCKADDR *)&ser_addr, sizeof(SOCKADDR)) != 0)
{
cout << "绑定失败!\n";
return 1;
}
else
{ cout << "服务器端已成功启动......\n\n"; }


    while (1)   //服务器端继续搜索新的连接
    {
 //侦听
if (int i = listen(sever,6) != 0)
{
cout << "侦听失败: " << WSAGetLastError() <<endl;
return 1;
}
cliAddrLen = sizeof(SOCKADDR);
//返回客户端套接字   cli_addr 为客户端的地址及端口信息
if((client = accept(sever,(SOCKADDR *)&cli_addr,&cliAddrLen)) == INVALID_SOCKET)
{
cout << "客户端已经断开连接!\n\n";
break;
}
cout << "Client Ip: " << inet_ntoa(cli_addr.sin_addr) << endl;
   cout << "Client Port: " << ntohs(cli_addr.sin_port) << endl;


// ULONG ul=1;
///阻塞控制,用了selec选择就不需要用此函数了
// if (ret=ioctlsocket(client,FIONBIO,&ul) == SOCKET_ERROR)
// {
// cout << "Call ioctlsocket function fail !\n";
// return 1;
// }

FD_ZERO(&fdRead);  //清空集合
FD_SET(client,&fdRead); //将client加入到读取集合中


bool bAvail = true;
///接收数据
while( bAvail )
{
FD_SET(client,&fdRead); //将client加入到读取集合中

///缓冲区里有可读数据才返回,不然阻断程序
  timeval t = {0};
  t.tv_usec = 10000*500;
char sendBuf[1024];
if ( (ret = select(0,&fdRead,NULL,NULL,&t)) <= 0 )  //阻塞控制
{
continue;
}
if (ret>0)
{
if (FD_ISSET(client,&fdRead))  //client in fdRead
{
int RecvBytes=0;
do   //循环读取数据,直到缓冲区中的数据读完
{
//接收数据
RecvBytes = recv(client,buf,sizeof(buf),0);
if (RecvBytes==SOCKET_ERROR || RecvBytes == 0)
{
cout << "数据接收失败或客户端已经断开!\n";
bAvail = false;
break;
}
buf[RecvBytes] = 0; //给数据串加上结束符
//打印收到数据
cout << "收到" << RecvBytes <<" bytes 数据:  "
<< buf <<endl;
cout << "发送: ";
cin.getline(sendBuf,1024);
///向客户端发送数据
if(send(client,sendBuf,strlen(sendBuf),0) ==-1)
return -1;
Sleep(2*1000);
} while (RecvBytes>0);
}
}
FD_ZERO(&fdRead);
}//while
closesocket(client);
   }//while
    
cout << "end\n";
Sleep(5000);


FD_CLR(client,&fdRead);
closesocket(sever);
WSACleanup();
return 0;

}



 //  客户端程序 Client.cpp


//===================================================================================================


#include <iostream>
#include <WINSOCK2.H>
#include <cstring>
#pragma comment(lib,"WS2_32.lib")
using namespace std;


#define DES_IP "127.0.0.1"
#define DES_PORT 5000


int main()
{
SOCKET sock;
char buf[1024]; //发送的字串
SOCKADDR_IN ser_addr;
WSADATA wsaData;
WORD wVersionRequired;
wVersionRequired = MAKEWORD(2,2);
if (WSAStartup(wVersionRequired,&wsaData)!=0)
{
cout<<WSAGetLastError()<<endl;
cout << "初始化失败!\n";
// return 1;
}


//if (sock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,1))
// 创建套接字两种方式
sock = socket( AF_INET, SOCK_STREAM, 0 );
// if (sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)
// {
// cout << "创建套接字失败!\n\n";
// return 1;
//   }


ser_addr.sin_addr.S_un.S_addr = inet_addr(DES_IP);
ser_addr.sin_port = htons(DES_PORT);
ser_addr.sin_family = AF_INET;
memset(ser_addr.sin_zero,0,8);
    //连接
if (connect(sock,(SOCKADDR *)&ser_addr,sizeof(SOCKADDR_IN))!=0)
{
int nError = WSAGetLastError();
cout << "连接服务器端失败\n";
return 1;
}
else 
{
cout << "成功连接服务器,可以开始发送数据,输入\"exit\"时断开连接\n\n";
}
//发送数据
do 
{
int SentBytes;
int RecvBytes;
char strRecv[1024] = {0};
cout << "发送:";
cin >> buf;
if(strcmp(buf,"exit") ==0 ) break;
SentBytes = send( sock,buf, strlen(buf), 0 );
if (SentBytes == SOCKET_ERROR)   ///发送失败
{
cout << "发送数据失败!\n\n";
break;
}
// else //发送成功
// {
// cout << buf <<endl;
// }
if ((RecvBytes = recv(sock,strRecv,sizeof(strRecv),0)) != SOCKET_ERROR)
{
strRecv[RecvBytes] = 0;
cout << "接收: " << strRecv << endl;
}
else
{
   cout << WSAGetLastError() <<endl;
cout << "接收数据失败!\n";
}
Sleep(1000);
} while (1);
    closesocket(sock);
WSACleanup();
return 0;
}



//=================================================================================================================================


 


 


运行结果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值