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

本文提供了一个使用C语言实现的TCP/IP套接字通信示例,包括客户端和服务端的完整代码。通过面向连接的方式进行数据收发,并展示了如何在Windows环境下使用Winsock2库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

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

 

 

运行结果图:


 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值