欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

程序员文章站 2022-06-06 08:40:41
...

单客户端和服务端的通信(基于UDP)   代码

服务端代码socket3.c

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<netdb.h>
#include<errno.h> 
#define PORT 8888
#define MAX_MSG_SIZE 1024 
int main(void)
{   
	int sockfd, addrlen, n;   
	struct sockaddr_in addr;   
	char msg[MAX_MSG_SIZE];   
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);   
	if (sockfd < 0)   
	{      
		fprintf(stderr, "socket failed\n");      
		exit(EXIT_FAILURE);   
	}   
	addrlen = sizeof(struct sockaddr_in);  
	bzero(&addr, addrlen);   
	addr.sin_family = AF_INET;   
	addr.sin_addr.s_addr = htonl(INADDR_ANY);  
	addr.sin_port = htons(PORT);  
	if (bind(sockfd, (struct sockaddr*)(&addr), addrlen) < 0)  
	{    
		fprintf(stderr, "bind fail\n");   
		exit(EXIT_FAILURE); 
	}  
	puts("bind success");  
	while (1) 
	{     
		bzero(msg, MAX_MSG_SIZE);   
		n = recvfrom(sockfd, msg, sizeof(msg), 0, (struct sockaddr *)(&addr), &addrlen);   
		fprintf(stdout, "Recevie message from client is %s\n", msg); 
		fgets(msg, MAX_MSG_SIZE,stdin);  
		printf("Server endpoint input message %s\n", msg);   
		sendto(sockfd, msg, n, 0,(struct sockaddr *)(&addr), addrlen); 
	}   
	close(sockfd);  
	exit(EXIT_SUCCESS);
}

客户端代码socket4.c

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h> 
#define MAX_BUF_SIZE 1024
#define PORT 8888 
int main() 
{  
	int sockfd, addrlen, n;  
	char buffer[MAX_BUF_SIZE]; 
	struct sockaddr_in addr; 
	sockfd = socket(AF_INET, SOCK_DGRAM, 0); 
	if (sockfd < 0)  
	{   
		fprintf(stderr, "socket falied\n");    
		exit(EXIT_FAILURE);
	}   
	addrlen = sizeof(struct sockaddr_in);  
	bzero(&addr, addrlen); 
	addr.sin_family = AF_INET;   
	addr.sin_port = htons(PORT); 
	addr.sin_addr.s_addr = htonl(INADDR_ANY);  
	puts("socket success"); 
	while(1)  
	{    
		bzero(buffer, MAX_BUF_SIZE);    
		fgets(buffer, MAX_BUF_SIZE, stdin); 
		sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)(&addr), addrlen);      
		printf("client send msg is %s\n", buffer);    
		n = recvfrom(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)(&addr), &addrlen);     
		fprintf(stdout, "clinet Receive message from server is %s\n", buffer);  
	}  
	close(sockfd);   
	exit(0);  
	return 0;
}

  运行结果截图如下:

 

5、总结

服务端:socket->bind->(sendto 、revcfrom)

客户端:socket->(sendto 、revcfrom)

upd不是面相连接的,这个是和tcp本质区别,数据可能会乱序,重复。