Linux网络编程之TCP、UDP服务器

网络编程

网络编程作用在于,用来跨主机,远距离的数据通信。

网络编程离不开:
套接字:socket(网络程序的编程接口)
IP:互联网中主机的唯一标识
特殊IP:
回路IP 127.0.0.1 所有IP:INADDR_ANY(0.0.0.0)
端口:用于表示网络数据由那个程序来接受处理
网络字节序:用于避免不同主机由于数据存储方式不同而造成数据解析不一致,网络字节序规定,左右的主机以大端的方式来存储数据 。

UDP服务器端:

1、创建一个数据包类型的套接字
int socket =socket(AF_INET,SOCK_DGRAM,0);
2、绑定地址信息
bind(socket,(struct sockaddr*)&server,sizeof(structsocjaddr_in));
3、接收客户端信息:
struct sockaddr_in client:
int len = sizeof(struct sockaddr_in);
recvfrom(socket,buf,sizeof(buf),0,(struct aockaddr*)&client,len);
4、发送消息给客户端
sento(socket,buf,strlen(buf),0,(structsockaddr*)&client,len);
5、关闭套接字
close(socket)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#define SOCKADDR struct sockaddr
int main(int c,char* v[])
{
	if(c < 3)
	{
		puts("参数错误 请按照[exe ip PORT]方式传入!");
		return -1;
	}
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	struct sockaddr_in server = {0};
	int len = sizeof(struct sockaddr_in);
	if( sockfd < 0)
	{
		perror("socket");
		return -1;
	}

	server.sin_family = AF_INET;
	server.sin_port = htons(atoi(v[2]));
	server.sin_addr.s_addr =  inet_addr(v[1]);

	if( bind(sockfd,(SOCKADDR*)&server,len) < 0)
	{
		perror("bind");
    	close(sockfd);
		return -1;
	}
	char buf[256] = {0};
	struct sockaddr_in client = {0};
	while(1)
	{
	recvfrom(sockfd,buf,sizeof(buf)-1,0,(SOCKADDR*)&client,&len);
    printf("(%s %d)发来信息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
    bzero(buf,sizeof(buf));
	char *p="123";
	sendto(sockfd,p,strlen(p),0,(SOCKADDR*)&client,len);
    }
	close(sockfd);
		return 0;
}


TCP 服务器端:

1、创建一个流式类型的套接字,该套接字专用于监听客户端连接.
int sockl = socket(AF_INET,SOCK_STREAM,0);
2、绑定地址信息.注意:(sockaddr结构体需要用sockaddr_in 来替代)
bind(sockl,(struct sockaddr*)&server,sizeof(struct sockaddr_in));
3、监听客户端连接
listen(sockl,5);
4、接收客户端连接,当三次握手过程结束后,会返回一个专用于和客户端通讯的套接字
struct sockaddr_in client;
int len = sizeof(struct sockaddr_in);
sockc = accept(sockl,(struct sockaddr*)&client,&len);
5、接收客户端的信息.
recv(sockc,buf,sizeof(buf),0);
注意: recv函数返回0,表明客户端断开连接.
6、发送消息给客户端.
send(sockc,buf,strlen(buf),0);
7、关闭套接字
close(sockc);
close(sockl);

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>

#define SOCKADDR struct sockaddr
int main(int c,char * v[])
{
	if( c < 3)
	{
		puts("参数错误!");
		return -1;
	}
	int sockl;
	sockl = socket(AF_INET,SOCK_STREAM,0);
	if(sockl < 0)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in server = {0};
	int len = sizeof(struct sockaddr_in);

	server.sin_family = AF_INET;
	server.sin_port = htons(atoi(v[2]));
	server.sin_addr.s_addr =inet_addr(v[1]);
	if(bind(sockl,(SOCKADDR*)&server,len) < 0)
	{
		perror("bind");
		close(sockl);
		return -1;
	}
        listen(sockl,5);

	struct sockaddr_in client = {0};
	int sockc = accept(sockl,(SOCKADDR*)&client,&len);
	if(sockc < 0)
	{
		perror("sockc");
		close(sockl);
		return -1;
	}
	printf("[%s  %d],已连接!\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

         char* pszWei ="welcome to Xian";
	send(sockc,pszWei,strlen(pszWei),0);
	char buf[256] = {0};
	if ( !recv(sockc,buf,sizeof(buf) - 1,0))
	{
		printf("[%s %d]已退出!\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
		close(sockc);
	}
	else
	{
		printf("[%s %d]发来消息:%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);

	}
		close(sockl);

	return 0;
}

代码复制老早之前的,有问题请留言联系我。

记得刚学会UDP服务器,我们就迫不及待的写好服务器、客户端,实现了互相通信,虽然信息发过来了,但是还是不了解通信机制,发送过程中是以什么形式发送,随后联想到蓝牙、红外线、数据线等等,传输数据都是以什么形式,什么信号,怎么互相转换一系列问题,迫于资源有限,一直等到了现在,学习过程是特别枯燥的,但是学会一个技能并能在实际中运用它,那是特别开心的,也是学习下去的动力,这也就是多数人喜欢实践而不喜欢理论的原因,实践出真知,但也是基于理论上实践的,所以还是好好学习,接受汲取更多的知识,充实自己。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值