`

客户端与服务器端 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.
分享到:
评论

相关推荐

    socket实现客户端与服务器端通信

    本示例中的"socket实现客户端与服务器端通信"是一个简单的C#项目,它演示了如何使用Socket类在两者之间建立连接并进行数据传输,同时包含了异常退出的处理机制。这个项目包含两个部分:SocketServer和SocketClient,...

    利用socket实现客户端服务器之间简单通信

    `TCP_server.py`文件通常包含了服务器端的代码,它会创建一个socket对象,绑定到特定的IP地址和端口,然后调用listen()方法监听连接。当有客户端连接时,accept()方法会被阻塞,直到客户端发起连接请求,此时服务器...

    socket通信 不可多得的客户端与服务器端代码

    在这个项目中,我们看到的是一个包含了服务器端和客户端的Socket通信示例,开发环境是经典的Eclipse IDE。 首先,让我们深入理解一下Socket通信的基本概念。Socket在计算机网络中相当于一个通信端点,它允许两个...

    C#客户端和服务器端通信程序代码

    本示例聚焦于"C#客户端和服务器端通信程序代码",这是一个关键主题,涉及到多个知识点,包括C#编程语言、网络编程基础、套接字(Socket)通信以及多线程处理。 1. **C#编程语言**:C#是微软公司推出的一种面向对象...

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

    总结起来,"TCPSOCKET线程池通信客户端+服务器端示例代码"是.NET开发者学习如何利用TCP SOCKET进行高效、多线程通信的宝贵资源。通过理解和实践这个示例,开发者可以更好地掌握网络编程技术,为开发高性能的网络应用...

    C# Socket 通信,客户端服务器端

    本教程将深入讲解C#中的Socket通信,包括客户端和服务器端的实现,以及如何通过源码学习相关知识。 首先,我们要理解Socket的基本概念。Socket,也称为套接字,是网络通信中的一个接口,它允许应用程序通过网络发送...

    客户端和服务器端的简单通信

    3. **Java Socket通信示例**: - 服务器端代码通常包含一个无限循环,不断接受新的客户端连接并处理它们。每个新连接都会创建一个新的线程来处理,以支持并发连接。 - 客户端代码则相对简单,只需一次连接到服务器...

    android基于WiFi的socket客户端和服务器端

    在Android平台上实现基于WiFi的Socket通信,涉及到网络编程的核心概念,包括TCP/IP协议、套接字(Socket)以及客户端(Client)与服务器端(Server)的交互。本篇将详细阐述这些知识点,并以"SocketServer"和"Socket...

    C语言利用socket套接字实现客户端和服务器端TCP通信实例

    本篇将详细探讨如何利用C语言的socket套接字实现客户端和服务器端的TCP通信。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,并在数据传输过程中进行确认和重传...

    scoket编程中客户端与服务器端的信息互通

    以上就是Socket编程中客户端与服务器端信息互通的基本概念和示例代码。实际应用中,我们还需要考虑异常处理、多线程(处理多个客户端连接)、数据编码解码等问题,以确保网络通信的稳定和高效。

    java实现TCP多客户端与服务器端的通信

    本篇文章将聚焦于如何使用Java来实现多客户端与服务器端的TCP通信。 首先,我们需要理解TCP通信的基本原理。TCP提供了一种点对点的、全双工的数据通信方式,通过三次握手建立连接,然后进行数据传输,最后通过四次...

    socket通信(客户端,服务端源代码)

    接下来,我们将深入探讨Socket通信的基本概念、工作原理以及如何在Java中实现客户端和服务端的代码。 ### 1. Socket基本概念 Socket,又称为套接字,是网络通信的一种接口,允许两个进程之间通过网络进行数据交换...

    MFC_Socket_VS2010编程(客户端+服务器端).rar

    在这个“MFC_Socket_VS2010编程(客户端+服务器端).rar”压缩包中,包含了两个关键文件:“SocketTest_Client”和“SocketTest_Server”,分别代表了Socket通信的客户端和服务器端应用。 首先,让我们深入了解一下...

    SuperSocket示例源码,带客户端和服务器端

    在本文中,我们将深入探讨SuperSocket的核心概念、功能特性,以及如何利用提供的客户端和服务器端示例源码进行开发。 首先,SuperSocket提供了一个简单而强大的API,允许开发者快速构建基于TCP/IP的服务器应用程序...

    C++写的服务器与Java写的客户端通过Socket通信C++代码

    - `server.cpp`: 这是C++服务器端的源代码文件,包含了Socket通信的实现逻辑。 - `server.ncb`: 这可能是Visual Studio的一个项目文件,用于存储解决方案的非编译信息。 - `server.sln`: 这是Visual Studio的解决...

    socket编程实例,客户端和服务器端一对一信息传输

    在这个"socket编程实例,客户端和服务器端一对一信息传输"的示例中,我们将会探讨如何在Microsoft Visual C++ (VC++)环境下利用Socket API来构建一个简单的点对点通信系统。 首先,我们要了解Socket的基本概念。...

    android 与 PC socket 通信示例测试过

    在Android与PC之间使用Socket通信时,Android设备作为客户端(Client),而PC则作为服务器(Server)。 **Android客户端实现:** 1. **创建Socket对象**:Android客户端首先需要创建一个Socket对象,指定服务器的IP...

    socket C语言编写 客户端和服务器端程序

    本文将深入讲解如何使用C语言来编写客户端和服务器端的socket程序,以便实现两者间的通信。 首先,我们要理解socket的基本概念。Socket,又称为套接字,是网络通信的一种接口,它允许两个进程(可以是同一台机器上...

    客户端与服务器端进行简单的会话

    一旦有客户端连接,服务器端就会创建一个Socket实例来与该客户端通信。`server5.java`文件可能是这样的一个服务器端程序,它包含了设置监听端口,接受客户端连接,读取客户端请求,处理请求,以及向客户端发送响应的...

    android登陆注册客户端与服务器端程序

    在Android应用开发中,用户身份验证是至关重要的环节,它涉及到客户端与服务器端的交互,确保用户的安全登录和注册。本示例项目“android登陆注册客户端与服务器端程序”提供了一个完整的解决方案,覆盖了从客户端...

Global site tag (gtag.js) - Google Analytics