c语言套接字输入输出字符串,socket套接字通信C语言示例vc6.0

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

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

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

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

服务器端代码 sever.cpp

///一、初始化套接字

///二、创建套接字

///三、绑定

///四、侦听

///五、接收

///六、发送

///七、销毁连接

#include

#include

//#include

#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() <

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 <

<< buf <

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

#include

#include

#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<

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 <

// }

if ((RecvBytes = recv(sock,strRecv,sizeof(strRecv),0)) != SOCKET_ERROR)

{

strRecv[RecvBytes] = 0;

cout << "接收: " << strRecv << endl;

}

else

{

cout << WSAGetLastError() <

cout << "接收数据失败!\n";

}

Sleep(1000);

} while (1);

closesocket(sock);

WSACleanup();

return 0;

}

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

运行结果图:

369c4c558b11dc0d8ec994375bb3a73e.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值