`
cwqcwk1
  • 浏览: 86907 次
文章分类
社区版块
存档分类
最新评论

基于TCP的socket通信过程及例子

 
阅读更多

Socket也叫套接字,用来实现网络通讯,通过调用系统提供的API,可以和远程的机子传输数据。Socket有很多种协议,而这篇文章主要讨论TCP部分的内容,也就是说后面说的内容主要是指TCP Socket。

Socket 通信的一般过程:


阻塞socket(同步socket)

进程或线程执行到某些socket函数时必须等待该socket事件的发生,如果该事件没有发生,socket函数不能立即返回,进程或线程被阻塞。

特点:使用简单,适合一对一的应答场合,在服务端很少使用,或配合多线程使用

函数 返回值说明 阻塞情况
accept() 返回新的连接socket句柄。 缓冲区队列没有新的等待连接
connect() 返回-1说明连接失败,其他正常。 连接过程阻塞。
recv() 返回值小于1代表接收失败,其他代表接收数据的长度。 发送缓冲区有数据等待发送完成,或接收缓冲区没数据时阻塞。
send() 返回-1代表发送失败,其他为发送数据的长度 发送缓冲区没有足够空间保存此次发送数据时阻塞


非阻塞socket(异步socket)

进程或线程执行socket函数时不必非要等待该socket事件的发生,一旦执行立即返回。根据返回值的不同可以判断函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程可以不被阻塞,继续执行。

特点:函数执行立即返回,不会阻断进程,性能比阻塞高,适合在主线程直接调用,不会造成主线程卡顿现象

因为socket默认是阻塞的,所以要设置非阻塞模式:

#ifdef WIN32 
	DWORD nMode = 1; 
	ioctlsocket(m_sock, FIONBIO, &nMode);
#else
	int r = fcntl(fd, F_GETFL, 0));
	fcntl(fd, F_SETFL, r|O_NONBLOCK);
#endif
TCP与UDP 的区别


协议说明 socket创建
TCP 传输控制协议,可靠的连接服务。双方先建立连接再传输数据。提供超时重发,数据检验,流量控制等机制,保证数据发送无误。 socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
UDP 用户数据报协议,不可靠的连接服务。没有建立连接就可以发送数据,没有超时重发机制,传输速度很快。 socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

Socket例子

下面以一个简单例子来说明服务端与客户端的交互过程

服务端 server.cpp

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#define PORT 8080

int main()
{
	//初始化winsock服务
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);

	//创建socket
	SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	struct sockaddr_in svraddr;
	svraddr.sin_family = AF_INET;
	svraddr.sin_port = htons(PORT);
	svraddr.sin_addr.s_addr = htonl(INADDR_ANY);

	//绑定socket
	bind(sock, (struct sockaddr*)&svraddr, sizeof(svraddr));

	//监听socket
	listen(sock, 5);

	while(1)
	{
		struct sockaddr_in addr;
		int len = sizeof(SOCKADDR);

		char buf[1024] = {0};

		//接受客户端连接
		SOCKET client = accept(sock, (struct sockaddr*)&addr, &len);

		char* ip = inet_ntoa(addr.sin_addr);
		printf("accept client: %s\r\n", ip);

		//接收客户端数据
		if(recv(client, buf, 1024, 0) >0)
		{
			printf("recv client: %s\r\n", buf);

			//向客户端发送数据
			send(client, "hello, client", strlen("hello, client"), 0);
		}
		closesocket(client);
	}

	//关闭socket
	closesocket(sock);

	//关闭winsock服务
	WSACleanup();

	return 0;
}
客户端 client.cpp

#include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")

#define REMOTE_IP "127.0.0.1"
#define REMOTE_PORT 8080

int main()
{
	//初始化winsock服务
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);

	//创建socket
	SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	struct sockaddr_in svraddr;
	svraddr.sin_family = AF_INET;
	svraddr.sin_port = htons(REMOTE_PORT);
	svraddr.sin_addr.s_addr = inet_addr(REMOTE_IP);

	//连接socket
	if( connect(sock, (struct sockaddr*)&svraddr, sizeof(svraddr)) != -1)
	{
		//发送数据给服务端
		if(send(sock, "hello, server", strlen("hello, server"), 0) != -1)
		{
			//接收服务端数据
			char buf[1024] = {0};
			if(recv(sock, buf, 1024, 0) >0)
			{
				printf("recv server: %s\r\n", buf);
			}
			
		}
	}
	else
	{
		printf("can not connect server\r\n");
	}

	//关闭socket
	closesocket(sock);

	//关闭winsock服务
	WSACleanup();
	getchar();
	return 0;
}


分享到:
评论

相关推荐

    MFC TCP Socket通信简单的小例子

    本篇文章将围绕“MFC TCP Socket通信”的主题,详细解释这个简单小例子中的关键知识点。 首先,TCP是一种面向连接的、可靠的传输协议,它确保数据的无序传输得到纠正,丢失的数据会被重传,而重复的数据则会被丢弃...

    Android TCP Socket通信封装

    本篇文章将详细介绍如何在Android平台上进行TCP Socket通信的封装,并结合实际例子进行说明。 首先,我们需要创建一个`SocketClient`类,作为客户端来连接服务端。这个类通常包含以下组件: 1. **初始化连接**:在...

    Qt TCP socket通信

    基于Qt实现的TCP socket通信,这是我学习qt socket通信自己写的一个小例子,希望对你有所帮助。整个文件包括服务端和客户端工程代码,具有如下功能: 1. 服务端支持多个客户端与之连接; 2. 服务端支持客户端...

    QT TCP Socket 通信示例

    在QT中,TCP Socket通信是网络编程的重要部分,允许程序间通过Internet进行数据传输。本示例将深入讲解如何在QT中实现TCP Socket通信。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于...

    socket编程基于tcp的通信

    本文将深入探讨基于TCP的Socket编程,包括基本概念、工作原理以及如何创建和使用TCP服务器(TcpSrv)和客户端(TcpClient)。 首先,理解TCP Socket编程的基础知识至关重要。Socket可以看作是两台计算机之间进行...

    C# TCP/IP通信小例子

    本示例"**C# TCP/IP通信小例子**"是一个基础教程,旨在帮助新手理解如何在C#中实现TCP/IP通信。 TCP(传输控制协议)和IP(因特网协议)是Internet上最基础的通信协议,TCP负责确保数据的可靠传输,而IP则处理...

    C# Socket tcp 最简单例子源码

    本示例将深入解析"C# Socket tcp 最简单例子源码",帮助你理解如何在C#中实现TCP(传输控制协议)客户端和服务端的通信。 首先,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按顺序无损...

    Delphi 编写TCP/IP网络Socket通信程序

    本例子就是Delphi中如何利用Socket编写通信程序。 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆...

    基于socket简单通信协议实现

    在TCP Socket通信中,数据传输是可靠的,因为TCP协议保证了数据的顺序和完整性。TCP连接建立后,数据会按照顺序发送,如果数据在传输过程中丢失或损坏,TCP会自动重传。 四、UDP Socket通信 UDP Socket通信则相对...

    Tcp ip socket 简单例子

    在IT行业中,TCP/IP协议族是网络通信的基础,而Socket编程则是实现TCP/IP通信的关键接口。这个"Tcp_ip socket 简单例子"提供了一个学习基础Socket编程的起点,特别适合初学者。在这个实例中,多线程技术被用于提高...

    C# Socket通信协议小例子

    本示例将探讨"C# Socket通信协议小例子",帮助开发者理解如何在C#中使用Socket进行网络编程。 Socket,通常被称为套接字,是网络编程中的基本组件,它允许应用程序通过网络发送和接收数据。在C#中,Socket类位于...

    TcpClient和TcpSocket写的聊天软件

    总的来说,TcpClient和TcpSocket是.NET Framework提供的强大工具,可以帮助开发者轻松地实现基于TCP的网络通信。通过理解它们的工作原理和用法,开发者可以构建出各种复杂的网络应用程序,如本文介绍的聊天软件。...

    socket文件传输(TCP)源码实例

    TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,确保了数据的正确顺序和无丢失传输。 首先,我们需要了解TCP socket的基本操作步骤: 1. **创建Socket**:在客户端...

    基于TCP的异步通信例子

    本实例主要探讨的是基于TCP的异步通信,通过分析提供的"TCP异步socket通信实例",我们可以深入理解其工作原理和实现方式。 首先,TCP异步通信的核心在于非阻塞I/O操作。在同步通信中,当一个进程进行I/O操作时,如...

    .net SOCket通信的小例子,超简单

    .NET Socket通信是一个基础且强大的网络编程工具,常用于构建...在实际项目中,Socket通信可能涉及更复杂的架构,如异步操作、心跳检测、多路复用等,但这个小例子是一个很好的起点,帮助你理解网络通信的核心原理。

    c# socket 异步通信 例子

    C#中的异步Socket通信主要依赖两个关键方法:`BeginConnect`和`EndConnect`用于建立连接,`BeginSend`和`EndSend`用于发送数据,以及`BeginReceive`和`EndReceive`用于接收数据。 1. **建立异步连接** 使用`...

    linux epoll服务器+windows 客户端 socket tcp通信的例子.zip

    这个压缩包可能包含了一个示例代码,演示了如何在Linux服务器端使用epoll处理TCP连接,并在Windows客户端进行相应的socket通信。通过分析和运行这个例子,可以深入理解epoll和TCP在实际应用中的工作原理和实现方式。

    matlab环境下socket通信

    `实例42`可能是提供了一个具体的MATLAB Socket通信的例子,可能包括客户端和服务器的MATLAB脚本,用于演示如何设置Socket连接,发送和接收数据。为了深入理解,你需要打开并分析这些示例脚本,看看它们是如何运用...

    c# tcpsocket 原生代码编写 客户端和服务端程序

    在IT行业中,网络通信是不可或缺的一部分,而TCP(Transmission Control Protocol)和Socket是实现网络通信的基础。本教程将深入探讨如何使用C#语言编写原生的TCP Socket客户端和服务端程序。TCP是一种面向连接的、...

Global site tag (gtag.js) - Google Analytics