`

客户端与服务器端 socket通信示例代码

阅读更多
以下代码是服务器端与客户端简单进行TCP socket通信过程。


Server.cpp

#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

#define BUFSIZE 64
#define PORT 9999
int main()
{
	WSADATA wsadata;
	SOCKET sServer;
	SOCKET sClient;
	int retVal;
	char buf[BUFSIZE];

	if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
	{
		cout << "WSAStartup失败!" << endl;
		return -1;
	}
	
	sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);								/* ******************** 1 **************** */
	if (INVALID_SOCKET == sServer)
	{
		cout << "socket() 错误!" << endl;
		WSACleanup();
		return -1;
	}

	SOCKADDR_IN addrServ;
	addrServ.sin_family = AF_INET;
	addrServ.sin_port = htons(PORT);
	addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	retVal = bind(sServer, (const struct sockaddr*)&addrServ, sizeof(addrServ));		/* ******************** 2 **************** */
	if (SOCKET_ERROR == retVal)
	{
		cout << "bind 错误!" << endl;
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	retVal = listen(sServer,10);														/* ******************** 3 **************** */
	if (SOCKET_ERROR == retVal)
	{
		cout << "listen 错误!" << endl;
		closesocket(sServer);
		WSACleanup();
		return -1;
	}

	cout << "TCP服务器开始监听" << PORT << "端口" << endl;
	SOCKADDR_IN addrClient;
	int addrClientLen = sizeof(addrClient);
	sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientLen);				/* ******************** 4 **************** */
	if (INVALID_SOCKET == sClient)
	{
		cout << "accept() 错误!" << endl;
		WSACleanup();
		return -1;
	}

	while (true)
	{
		ZeroMemory(buf, BUFSIZE);
		retVal = recv(sClient, buf, BUFSIZE, 0);										/* ******************** 5 **************** */
		if (SOCKET_ERROR == retVal)
		{
			cout << "recv()错误!" << endl;
			closesocket(sServer);
			closesocket(sClient);
			WSACleanup();
			return -1;
		}

		SYSTEMTIME time;
		GetLocalTime(&time);
		char datetime[30];
		sprintf(datetime,"%4d-%2d-%2d %2d:%2d:%2d",time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
		cout << datetime << "从" << inet_ntoa(addrClient.sin_addr) << ":" << addrClient.sin_port << "接受了如下内容: " << buf << endl;

		if (strcmp(buf, "quit") == 0)
		{
			retVal = send(sClient, "quit", strlen("quit"), 0);
			break;
		}
		else
		{
			retVal = send(sClient, buf, strlen(buf), 0);								/* ******************** 6 **************** */
			if (SOCKET_ERROR == retVal)
			{
				cout << "send错误!" << endl;
				closesocket(sServer);
				closesocket(sClient);
				WSACleanup();
				return -1;
			}
		}
	}

	closesocket(sServer);
	closesocket(sClient);
	WSACleanup();

	return 0;
}



Client.cpp

#include <Winsock.h>
#include <string>
#include <iostream>

#pragma comment(lib, "ws2_32.lib")
using namespace std;


#define BUFSIZE 64
#define PORT 9999

int main()
{
	WSAData wsaData;
	SOCKET sHost;
	sockaddr_in addrServ;
	char buf[BUFSIZE];
	int retVal;
	
	if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
	{
		cout << "WSAStartup失败!" << endl;
		return -1;
	}
	
	sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == sHost)
	{
		cout << "socket() 错误!" << endl;
		WSACleanup();
		return -1;
	}
	
	addrServ.sin_family = AF_INET;
	addrServ.sin_port = htons(PORT);
	addrServ.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	
	retVal = connect(sHost, (LPSOCKADDR)&addrServ, sizeof(addrServ));
	if (SOCKET_ERROR == retVal)
	{
		cout << "connect 错误!" << endl;
		closesocket(sHost);
		WSACleanup();
		return -1;
	}
	
	while (true)
	{
		cout << "输入要发给服务器的内容" << endl;
// 		string msg;
// 		getline(cin, msg);
		char msg[BUFSIZE];
		cin.getline(msg, BUFSIZE);
		ZeroMemory(buf, BUFSIZE);
		strcpy(buf, msg);
		retVal = send(sHost, buf, strlen(buf), 0);
		if (SOCKET_ERROR == retVal)
		{
			cout << "发送失败" << endl;
			closesocket(sHost);
			WSACleanup();
			return -1;
		}
		
		retVal = recv(sHost, buf, sizeof(buf)+1, 0);
		cout << "从服务器端接收:" << buf << endl;
		if (strcmp(buf, "quit") == 0)
		{
			cout << "quit" << endl;
			break;
		}
	}
	
	closesocket(sHost);
	WSACleanup();
	
	
	return 0;
}





以下代码是服务器端与客户端简单进行UDP socket通信过程。
Server.cpp

#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

#define BUFSIZE 1024
#define PORT 9999
int main()
{
	WSADATA wsadata;
	SOCKET sServer;
	sockaddr_in addrClient, addrServer;
	int addrClientLen = sizeof(addrClient);
	char buf[BUFSIZE];

	if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
	{
		cout << "WSAStartup失败!" << endl;
		return -1;
	}
	
	sServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(PORT);
	addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	bind(sServer, (SOCKADDR*) &addrServer, sizeof(addrServer));
	cout << "从客户端接收:" << endl;
	recvfrom(sServer, buf, BUFSIZE, 0, (SOCKADDR *)&addrClient, &addrClientLen);

	sendto(sServer, buf, BUFSIZE, 0, (SOCKADDR *)&addrClient, sizeof(addrClient));



	cout << "完成接收:" << buf << endl;

	closesocket(sServer);



	WSACleanup();

	return 0;
}

Client.cpp

#include <winsock2.h>
#include <iostream>
#include <string>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

#define BUFSIZE 1024
#define PORT 9999
int main()
{
	WSADATA wsadata;
	SOCKET sClient;
	sockaddr_in addrServer;
	int addrServerLen = sizeof(addrServer);
	char buf[BUFSIZE];
	
	if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
	{
		cout << "WSAStartup失败!" << endl;
		return -1;
	}
	
	sClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(PORT);
	addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	cout << "请输入要发送给服务器的内容:" << endl;
	cin.getline(buf, BUFSIZE);
	sendto(sClient, buf, BUFSIZE, 0, (SOCKADDR *)&addrServer, addrServerLen);
	memset(buf, 0, BUFSIZE);

	recvfrom(sClient, buf, BUFSIZE, 0, (SOCKADDR *)&addrServer, &addrServerLen);
	cout << buf << endl;
	
	
	closesocket(sClient);
	
	
	
	WSACleanup();
	
	return 0;
}




1. 在服务器端的函数调用时,如果需要客户端的地址长度,则都是通过取地址的形式来使用的。
2. 非阻塞socket编程,需要在socket创建之后,调用
int ioctlsocket(
SOCKET s,
long cmd,//FIONBIO
u_long *argp
);

将socket设置为非阻塞模式。
3.
分享到:
评论

相关推荐

    TCPSOCKET 线程池通信客户端+服务器端示例代码

    TCP SOCKET多线程通信,使用.NET自带线程池,高效率 ,可用来测试端口防火墙等,注释详细,

    一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能)

    思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的...

    python服务器与android客户端socket通信实例

    主要介绍了python服务器与android客户端socket通信的实现方法,实例形式详细讲述了Python的服务器端实现原理与方法,以及对应的Android客户端实现方法,需要的朋友可以参考下

    Python实现的FTP通信客户端与服务器端功能示例

    本文实例讲述了Python实现的FTP通信客户端与服务器端功能。分享给大家供大家参考,具体如下: 一 代码 1、服务端代码 import socket import threading import os import struct #用户账号、密码、主目录 #也可以把...

    Vue与Node.js通过socket.io通信的示例代码

    在通信时,客户端与服务器端可以使用相同的API 2、怎么用 原理:创建Scoket.IO服务器,该服务器依赖于一个已经创建的HTTP服务器 服务器端引入 var http=require('http') var sio=require('socket.io') var ...

    Android开发之Socket通信传输简单示例

    本文实例讲述了Android Socket通信传输实现方法。分享给大家供大家参考,具体如下: 1.开篇简介 Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类)。要实现Socket的传输,需要构建...

    Python使用socket模块实现简单tcp通信

    主要介绍了Python使用socket模块实现简单tcp通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python通过websocket与js客户端通信示例分析

    这里,介绍如何使用 Python 与前端 js 进行通信。 websocket 使用 HTTP 协议完成握手之后,不通过 HTTP 直接进行 websocket 通信。 于是,使用 websocket 大致两个步骤:使用 HTTP 握手,...js 客户端先向服务器端 pyt

    基于Socket.IO实现Android聊天功能代码示例

    Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。 该种官方介绍看起来有点懵逼,简而言之就是:客户端可...

    .net 稳定 高效 易用 可同步 TCP 通信框架

    (也是需要开启服务器端) 以上两点可以兼容现有代码生成器时,客户端代码仅需要特别小的改动就可以。 3、基本功能。可以实现聊天,传文件,图片。 4、使用长连接,有断线自动连接功能,心跳包。 5、使用...

Global site tag (gtag.js) - Google Analytics