c socket

c socket"1.socke分类""2.基本操作函数""3.c实现的网络聊天程序"套接字(socket)是一个抽象层,应用程序可以通过它发送或接

大家好,又见面了,我是你们的朋友全栈君。

套接字(socket) *是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。 *

<span role="heading" aria-level="2">c socket

1. socke分类

>* **1.1流式套接字** 它提供了一种可靠的、面向连接的双向数据传输服务,实现了数据无差错、无重复的发送。在TCP/IP协议簇中,使用TCP协议来实现字节流的传输。

  • 1.2数据报套接字
    它提供了一种无连接、不可靠的双向数据传输服务。数据包以独立的形式被发送,并且保留了记录边界,不提供可靠性保证。在TCP/IP协议簇中,使用UDP协议来实现数据报套接字。
  • 1.3原始套接字
    该套接字允许对较低层协议(如IP或ICMP)进行直接访问。

2. 基本操作函数

>* **创建套接字 socket()** socket()函数调用的格式: `socket(int af,int type,int protocol);` 参数**af**指定套接字使用的协议族 **type**参数指定所需的通信类型。包括**数据流**、**数据报**、**原始类型**。 参数protocol说明该套接字使用的协议族中的特定协议。如果调用者不希望特别指定使用的协议,则置为0,使用默认的连接模式。

  • bind():绑定本地地址
    一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联
  • connect():将套接字连接到目的地址
    初始创建的套接字并未与任何外地目的地址关联。客户机可以调用connect()为套接字绑定一个永久的目的地址,将它置于已连接状态。
  • listen():设置等待连接状态
    对于一个服务器的程序,当申请到套接字,并调用bind()与本地地址绑定后,就应该等待某个客户机的程序来要求连接。listen()就是把一个套接字设置为这种状态的函数。
  • accept():接受连接请求
    服务器进程使用系统调用socket,bind和listen创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度。然后,服务器调用accept进入等待状态,直到到达一个连接请求。
  • send()/recv()和sendto()/recvfrom()
    发送和接收数据。

3. c实现的网络聊天程序]

  • client进程编码
# 
	#pragma comment(lib,"ws2_32.lib")
	#include<Winsock2.h>
	#include <stdio.h>
	#include <stdlib.h> 
	#define DATA_BUFFER 1024
	int main(int argc, char * argv[]){
	WSADATA wsaData;
	SOCKET sClient;
	int i =5;
	int iSend;
	int iPort = 5050;
	int iLen;
	char buf[DATA_BUFFER]; 
	struct sockaddr_in ser; 

	if(argc<2) 
		{
		printf("Usage: client [server IP address]\n"); 
		return -1;
		}
	memset(buf,0,sizeof(buf)); 
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		{
		printf("Failed to load Winsock.\n"); 
		return -1;
		}

	ser.sin_family = AF_INET; 
	ser.sin_port = htons(iPort); 
	ser.sin_addr.s_addr = inet_addr(argv[1]);
	sClient = socket(AF_INET,SOCK_STREAM,0); 
	if(sClient == INVALID_SOCKET)
		{
		printf("socket() Failed: %d\n",WSAGetLastError());
		return -1;
		}

	if(connect(sClient,(struct sockaddr *)&ser,sizeof(ser)) == INVALID_SOCKET)
		{
		printf("connect() Failed: %d\n",WSAGetLastError());
		return -1;
		}
	else
		{
		while(i-->0)
		{	
			iLen = recv(sClient,buf,sizeof(buf),0); 
		if(iLen == 0)
			return -1;
		else if(iLen == SOCKET_ERROR)
			{
			printf("recv() Failed: %d\n",WSAGetLastError());
			return -1;
			}

			else
			printf("recv() data from server: %s\n",buf); // 输出接收数据
			printf("输入:");
			scanf("%s",buf); 
			iSend = send(sClient,buf,sizeof(buf),0); 

			if(iSend == SOCKET_ERROR) //错误处理
			{
			printf("send() Failed: %d\n",WSAGetLastError());
			break;
			}
		else if(iSend == 0)
				{
				break;
				}
			else
				{
				printf("send() byte: %d\n",iSend); //输出发送成功字节数
				}
		}
		}	
	closesocket(sClient); //关闭 socket
	WSACleanup();
	return 0;}

  • sever进程编码

	#include <Winsock2.h>
	#include <stdio.h>
	#include <stdlib.h>
	#define DEFAULT_PORT 5050 //服务端默认端口
	int main(){
	int iPort = DEFAULT_PORT;  //输入端口号
	WSADATA wsaData;  //数据结构,用来存储被 WSAStartup()调用返回的socket 
	
	SOCKET sListen,sAccept;    // 
	int i =5;
	int iLen; //客户机地址长度
	int iSend; //发送数据长度
	char buf[] = "I am a server"; //要发送给客户的信息
	
	struct sockaddr_in ser,cli; //服务器和客户的地址
	
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		{	
		printf("Failed to load Winsock.\n"); //Winsock 初始化错误
		return -1;
		}
		
	sListen = socket(AF_INET,SOCK_STREAM,0); //创建服务器端套接字 ,SOCK_STREAM面向连接 
	
	if(sListen == INVALID_SOCKET)         // INVALID_SOCKET= -1 
		{
		printf("socket() Failed: %d\n",WSAGetLastError()); //返回上次发生的网络错误  ,INVALID_SOCKET =-1
		return -1;
		}
	
	//以下初始化服务器端地址
	ser.sin_family = AF_INET; //使用 IP 地址族
	ser.sin_port = htons(iPort); //主机序端口号转换为网络字节序端口号
	ser.sin_addr.s_addr = htonl(INADDR_ANY); //主机序 IP 地址转换为网络字节序主机地址 INADDR_ANY :0x00000000
	
	//使用系统指定的 IP 地址 INADDR_ANY
	if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR) //套接定与地址的绑定
		{
		printf("bind() Failed: %d\n",WSAGetLastError());
		return -1;
		}

	if(listen(sListen,5) == SOCKET_ERROR) //进入监听状态,listen的第二个参数为可以排队的最大连接个数   SOCKET_ERROR =-1 
		{
		printf("lisiten() Failed: %d\n",WSAGetLastError());
		return -1;
		} 
	iLen = sizeof(cli); //初始化客户端地址长度参数  16B
	
	while(1) //进入循环等待客户的连接请求
		{
		sAccept = accept(sListen,(struct sockaddr *)&cli,&iLen); //第一个参数:服务器的socket描述字,2: 指针,用于返回客户端的协议地址,3:协议地址的长度 
		
		if(sAccept == INVALID_SOCKET)
			{
			printf("accept() Failed: %d\n",WSAGetLastError());
			return -1;
			}
		
		printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port));
		//输出客户端 IP 地址和端口号
		while(i-->0)
		{
		
		iSend = send(sAccept,buf,sizeof(buf),0); //1指定发送端套接字描述符2存放应用程序要发送数据的缓冲区3发送的数据的字节数 4一般置0 
		if(iSend == SOCKET_ERROR) //错误处理
			{
			printf("send() Failed: %d\n",WSAGetLastError());
			break;
			}
		else if(iSend == 0)
				{
				break;
				}
			else
				{
				printf("send() byte: %d\n",iSend); //输出发送成功字节数
				}
		
		iLen = recv(sAccept,buf,sizeof(buf),0); 
		if(iLen == 0)
			return -1;
		else if(iLen == SOCKET_ERROR)
			{
			printf("recv() Failed: %d\n",WSAGetLastError());
			return -1;
			}
			else
			printf("recv() data from server: %s\n",buf); // 输出接收数据

		printf("输入:");
		scanf("%s",buf); 
		}
		closesocket(sAccept);
		}
	closesocket(sListen); //关闭 socket
	WSACleanup(); //输出发送成功字节数
	return 0;}

  • 输出结果

客户端

<span role="heading" aria-level="2">c socket

服务器端
<span role="heading" aria-level="2">c socket

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155789.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 图形推理1000题及答案_普华永道面试经验

    图形推理1000题及答案_普华永道面试经验做了今年pwc的笔试题,趁热总结一下。我进去的系统是SHL。逻辑推理、语言推理和数字推理部分都有8道小题的体验机会,正式开始测试之前可以先练下手热热身。逻辑推理的题目八成不会很难,但是会有几道让人很难受的题。比较基础的题刷了一遍下来,脑子里面也大概总结出了一些规律了。就跟大家分享一下8总结:1、大部分题目都存在因果关系。即第x个图形和第x-1个图形,甚至可能是和第x-2,x-n个图形存在关系。2、…

  • 51单片机最小系统的c语言,51单片机最小系统「建议收藏」

    51单片机最小系统的c语言,51单片机最小系统「建议收藏」本文内容以中心网站发布的“最小系统图片”为例进行讲解。1、为什么要讲单片机最小系统图1(51芯片+晶振+复位)=最小系统因为单片机的应用领域极为广泛,以单片机为核心的电路千奇百怪,而单片机最小系统是最基本的、也是小的不能再省略掉任何部分的系统了。尽管这样小了,但只要掌握它,就能设计出丰富多彩的电路来。2、什么是单片机最小系统很简单,单片机最小系统就是一块单片机芯片+晶振电路+复位电路,如图1所…

  • 姿态传感器mpu6050_六轴陀螺仪原理

    姿态传感器mpu6050_六轴陀螺仪原理目录标题1.前言(闲话)2.陀螺仪及MPU6050模块介绍3.硬件连接4.MPU60505.软件代码————官方自带库6.软件代码————其他代码7.学习补充(代码看不懂的时候可以来看一下)8.效果展示9.参考链接10.完整版代码链接1.前言(闲话)正在准备今年的国赛,打算做一个PID控制题目,于是就选了一个相对比较简单的风力摆,2.陀螺仪及MPU6050模块介绍3.硬件连接4.MPU60505.软件代码————官方自带库6.软件代码————其他代码7.学习补充(代码看不懂的时候可以来看一下

    2022年10月23日
  • Linux 操作系统基础知识总结

    Linux 操作系统基础知识总结1、操作系统总体介绍CPU:就像人的大脑,主要负责相关事情的判断以及实际处理的机制。查询指令:cat/proc/cpuinfo内存:大脑中的记忆区块,将皮肤、眼睛等所收集到的信息记录起来的地方,以供CPU进行判断。查询指令:cat/proc/meminfo1)物理内存物理内存,就是我们将内存条插在主板内存槽上的内存条的容量的大小。看计算机配置的时候,主要看的就是这个物理内存2)虚拟内存Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会

    2022年10月30日
  • python进阶(15)多线程与多进程效率测试「建议收藏」

    python进阶(15)多线程与多进程效率测试「建议收藏」前言在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程正常来讲,多线程要比多进程效率更高,因为进程间的切换需要的资源和开销更大,而线程相对更小,但是我们使用的Python大多

  • microsoft setup bootstrapper已停止工作

    microsoft setup bootstrapper已停止工作1.https://jingyan.baidu.com/article/6c67b1d6557f752787bb1e2b.html2.https://blog.csdn.net/a_flying_bird/article/details/51726220通过这两个方法还是没有解决,我估计要重装电脑。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号