网络基础--创建UDP和TCP客户端,创建TCP服务端程序

news/2024/5/18 16:00:02 标签: udp, tcp/ip, 网络

1、背景

工作中经常有创建TCP和UDP客户端程序的时候,因此在将创建客户端的TCP和UDP的代码记录一下。

  • socket创建
static int OpenSocket(char *svrIP, uint16_t svrPort, int mode)
{
	int sockfd = -1;
	int transport;			// 默认使用UDP
	struct sockaddr_in addr = {0, };
	
	if (!svrIP)
	{
		GB_PrintError("svrIP is invalid.\n");
		return -1;
	}

	transport = mode?SOCK_STREAM:SOCK_DGRAM;
	sockfd = socket(AF_INET, transport, 0);
	if (sockfd < 0)
	{
		GB_PrintError("create sock failed.\n");
		return -1;
	}

	int opt = 1;
	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0)
	{
		close(sockfd);
		GB_PrintError("SOL_SOCKET SO_REUSEADDR failed.\n");
		return -1;
	}

	// 如果是TCP 需要连接服务器
	if (mode)
	{
		memset(&addr, 0, sizeof(struct sockaddr_in));
		addr.sin_family = AF_INET;
		addr.sin_port = htons(svrPort);
		addr.sin_addr.s_addr = inet_addr(svrIP);
		if (connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) 
		{
			close(sockfd);
			GB_PrintError("connet svr failed. stream svrip:%s, stream svrPort:%d. error code:%d\n", svrIP, svrPort, errno);
			return -1;
		}
	}
	
	return sockfd;
}
  • 数据发送
static int sendStreamData(PreviewParam_t *handle, char *streamData, int streamLen, int mode)
{
	int w = 0;
	struct sockaddr_in addr = {0, };
	

	if (!handle || !streamData || streamLen<= 0 || handle->scokfd < 0)
	{
		GB_PrintError("handle error.\n");
		return -1;
	}

	
	// 如果是TCP方式
	if (mode)
	{
		w = send(handle->scokfd, streamData, streamLen, 0);
	}
	else 
	{
		addr.sin_family = AF_INET;
		addr.sin_port = htons(handle->svrPort);
		addr.sin_addr.s_addr = inet_addr(handle->svrIP);
		w = sendto(handle->scokfd, streamData, streamLen, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr));
	}

	return w;
}
  • 创建TCP服务端程序:
static int CreateTcpServer(uint16_t port)
{
	int sockfd = -1;
	struct sockaddr_in serveraddr = {0, };
	

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
 	if (sockfd < 0) 
 	{
		return -1;
 	}

 	int opt = 1;
	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt)) < 0)
	{
		close(sockfd);
		return -1;
	}

	bzero((char *) &serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
	serveraddr.sin_port = htons(port);
	if (bind(sockfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) 
	{
		close(sockfd);
		return -1;
	}

	if (listen(sockfd, 5) < 0) /* allow 5 requests to queue up */ 
	{
		close(sockfd);
		return -1;
	}

 	return sockfd;
}

  • 保存监听的句柄
int StreamServerProcess(void)
{
	int socket = -1;
	int clientLen = 0; 
	struct sockaddr_in clientAddr;
	StreamSvrHandle_t *pStreamHanle = NULL;

	
	pStreamHanle = GetStreamSvrHandle();
	if (!pStreamHanle)
	{
		return -1;
	}

	if (pStreamHanle->svrSocket == -1)
	{
		pStreamHanle->svrSocket = CreateTcpServer(STREAM_SERVER_PORT);
	}
	
	clientLen = sizeof(clientAddr);
	socket = accept(pStreamHanle->svrSocket, (struct sockaddr *) &clientAddr, &clientLen);
    if (socket < 0) 
    {
    	close(pStreamHanle->svrSocket);
    	pStreamHanle->svrSocket = -1;
		return -1;
    }
    else 
    {
		if (AddStreamHandle(socket, &clientAddr))
		{
			return -1;
		}
    }
	
	return 0;
}

参考资料:
网络基础–TCP/IP网络基础


http://www.niftyadmin.cn/n/1721697.html

相关文章

weblogic12.2启用管理端口报错解决

安装的是WebLogic Server 12.2.1.3.0&#xff0c;在一次安全漏洞修复工作中需要禁用业务端口&#xff0c;就是屏蔽业务端口对外开放。 具体操作方法如下&#xff1a; 登录控制台&#xff0c;找到实例名&#xff0c;锁定并编辑&#xff0c;勾选“启动管理端口”&#xff0c;管…

GB28181协议--实时视音频点播(预览)

1、基本要求 根据《GB/T 28181 —2016》第9章关于实时视音频点播的描述&#xff0c;其内容如下&#xff1a; 实时视音频点播的SIP 消息应通过本域或其他域的SIP 服务器进行路由、 转发, 目标设备的实时视音频流宜通过本域内的媒体服务器进行转发。实时视音频点播采用SIP 协议…

Windows中cmd登录mysql导入sql文件出现中文乱码

Windows中cmd登录mysql导入sql文件出现中文乱码。 日常工作中我们会通过cmd登录mysql&#xff0c;然后执行sql文件&#xff0c;但发现如果插入语句中的值有中文&#xff0c;就会乱码。这个事很头疼。 现在给大家演示一下&#xff0c;并给出解决方法。 一、演示乱码 1、首先…

GB28181协议--流媒体的几种传输方式(UDP、TCP被动、TCP主动模式)

1、简介 根据《GB/T 28181 —2016》4.3.1、5.2的要求&#xff0c;SIP和流媒体都应该支持TCP和UDP两种方式。如下图所示&#xff1a; 在附录F&#xff08;SDP 定义&#xff09;中介绍了TCP支持主动模式和被动模式&#xff0c;UDP没有做规定。下面将介绍这三种模式的差异。 2、…

linux下把软件做成自启服务方法

-----------------------oracle------------------------------------ 1、用oracle用户修改&#xff1a;/newtouch/app/oracle/product/11.2/db_1/bin/ 下的此文件 dbstart 将 ORACLE_HOME_LISTNER$1 改成 ORACLE_HOME_LISTNER$ORACLE_HOME 前提是用户的环境变量配置文件中配…

GB28181协议--校时

1、简介 根据《GB/T 28181 —2016》7.10、9.10的要求&#xff0c;GB28181设备网络校时功能描述如下&#xff1a; 联网系统内的IP 网络服务器设备宜支持 NTP(见IETF RFC2030) 协议的网络统一校时服务。 网络校时设备分为时钟源和客户端, 支持客户/服务器的工作模式; 时钟源应支…

linux下solr管理界面授权登录

solr默认可以直接访问管理界面&#xff0c;这样很危险&#xff0c;因此需要给配置上登录授权。 说明&#xff1a;以下操作中是我本地机器的目录&#xff0c;实际中要对应你们自己的路径。 1、创建role.properties文件&#xff0c; 进入/picclife/soft/solr-7.4.0/server/etc…

linux下weblogic12c漏洞修复打补丁基本操作

日常运维工作中我们有时需要给weblogic打补丁&#xff0c;补丁文件是oracle官方发布的zip包。下面均为我本地的目录结构&#xff0c;实际操作中以你实际的目录为准。 1、上传补丁并解压 cd /picclife/software/psu -----指定一个存放的目录 上传补丁&#xff1a;p30386660_1…