linux下C语言UDP通信

UDP:
无连接不可靠, 但是在稳定的网络中效率高

socket( AF_INET,  SOCK_DGRAM ,0) ;

struct sockaddr_in;
bind( ); // 为了确定目标

sendto (int socket, const void *message, size_t length,
              int flags, const struct sockaddr *dest_addr, //发送message给对应地址
              socklen_t dest_len);
 
ssize_t recvfrom(int socket, void *restrict buffer, size_t length,
              int flags, struct sockaddr *restrict address, // 保存地址

              socklen_t *restrict address_len);

实例:

server端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>

#include<sys/socket.h>
#include<netdb.h>

int port=8888;

int main()
{
	int sockfd;
	int len;
	int ret;
	char buf[256];
	struct sockaddr_in adr_inet;//server
	struct sockaddr_in adr_clnt;//client

	/* 建立socket */
	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd==-1)
	{
		perror("create socket error:");
		exit(1);
	}
	
	/* 建立IP地址 */
	adr_inet.sin_family=AF_INET;
	adr_inet.sin_port=htons(port);
	adr_inet.sin_addr.s_addr =htonl(INADDR_ANY);
	//inet_pton(AF_INET, "192.168.1.181", &srvaddr.sin_addr);
	bzero(&(adr_inet.sin_zero),8);
	len=sizeof(struct sockaddr_in);
		
	printf("server : waiting for client...\n");

	/* 绑定socket */
	ret=bind(sockfd, (struct sockaddr *)&adr_inet, sizeof(adr_inet));
	if(ret==-1)
	{
		perror("bind error");
		exit(1);
	}
	while(1)
	{
		/* 接受传来的信息 */
		ret=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_clnt,&len);
		printf("new connection: %s:%hu\n",inet_ntoa(adr_clnt.sin_addr), ntohs(adr_clnt.sin_port));
		if(ret<0)
		{
			perror("recvfrom error:");
			exit(1);
		}
		buf[ret]='\0';
		printf("server receive:%s",buf);
		/* 收到stop字符串,终止连接*/
		if(strncmp(buf,"stop",4)==0)
		{
			printf("recevice stop ,ending....\n");
			break;
		}
	}
	close(sockfd);
	exit(0);
}
client端

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>

#include<netdb.h>
#include<sys/socket.h>

int port=8888;

int main()
{
	int sockfd;
	int i=0;
	int ret;
	char buf[80],str1[80];
	struct sockaddr_in adr_srvr; //the address of server
	//ILE *fp;
	/*以只读的方式打开liu文件*/
	/*=fopen("test","r");
	if(fp==NULL)
	{
		perror("fopen error:");
		exit(1);
	}*/
	
	printf("client :  connecting server ...\n");
	/* 建立IP地址 */
	adr_srvr.sin_family=AF_INET;//TCP/IP family
	adr_srvr.sin_port=htons(port);//port
	//adr_srvr.sin_addr.s_addr = htonl(INADDR_ANY);//local IP
	inet_pton(AF_INET, "192.168.1.11",&adr_srvr.sin_addr.s_addr);
	bzero(&(adr_srvr.sin_zero),8);

	sockfd=socket(AF_INET,SOCK_DGRAM,0);//UDP
	if(sockfd==-1)
	{
		perror("create socket error:");
		exit(1);
	}

	/* 读取三行数据,传给udpserver*/
	for(i=0;i<3;i++)
	{
		fgets(str1,80,stdin);
		printf("client sending:");
		printf("%d:%s",i,str1);
		sprintf(buf,"%d:%s",i,str1);
	
		ret=sendto(sockfd,buf,sizeof(buf),0,\
			(struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
		if(ret<0)
		{
			perror("sendto error:");
			exit(1);
		}
	}
	sprintf(buf,"stop\n"); //send "stop" to server
	ret=sendto(sockfd,buf,sizeof(buf), 0, \
			(struct sockaddr *)&adr_srvr, sizeof(adr_srvr));
	if(ret<0)
	{
		perror("sendto error");
		exit(1);
	}
	//fclose(fp);
	close(sockfd);
	exit(0);
}

使用:

./server启用服务端

./client启用客户端,然后输入内容,服务端会收到。

ip和端口都在代码里定义了。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值