링크 ux 에서 udp 프로 그래 밍 을 통 해 이미지 파일 을 수신 하고 보 냅 니 다.

오늘 udp 프로 토 콜 을 사용 하여 그림 파일 을 수신 하고 보 냅 니 다. 그림 형식 은 bmp 입 니 다.
udp 는 사 무 를 대상 으로 하 는 간단 하고 신뢰 할 수 없 는 정보 전송 서 비 스 를 제공 합 니 다. 비교적 좋 은 실시 성 을 가지 고 연결 되 지 않 은 전송 층 프로 토 콜 입 니 다. 작업 효율 이 TCP 보다 높 습 니 다. 먼저 udp 프로 그래 밍 절 차 를 소개 합 니 다.
udp 클 라 이언 트:
1. socket 소켓 만 들 기
2. ip port 설정 
3. sendto () 메시지 보 내기
4. close () 소켓 닫 기
udp 서버:
1. socket 소켓 만 들 기
2. ip port 설정 
3. setsockopt () 포트 바 인 딩 제한 취소 (선택 가능)
4. bind () 바 인 딩 ip port
5. recvfrom () 수신 정보
6. close () 소켓 닫 기
헤더 파일:
#ifndef _HEAD_H
#define _HEAD_H

#include         

#include          //socket所需头文件
#include 

#include   //ip 地址转换所需头文件
#include 
#include    //htonl  htons 所需的头文件

#include    //memset 所需头文件
#include   //write read 所需头文件

#include 	//malloc 所需头文件

#include   //open 所需头文件
#include 

#endif


클 라 이언 트:
#include "head.h"


int main(int argc,char *argv[])
{
	
	if(argc<3)
	{
		//如  ./client 192.168.8.62 8888 /mnt/hgfs/Vms/a.bmp 
		printf("传参少了,你应该输入 ./main ip port bmp
"); return -1; } int client_fd; struct sockaddr_in dest_addr; //创建套接字 client_fd = socket(AF_INET,SOCK_DGRAM,0); //UDP if(client_fd == -1) { printf("create endpoint failed
"); return -1; } //配置参数 dest_addr.sin_family = AF_INET; dest_addr.sin_addr.s_addr = inet_addr(argv[1]); dest_addr.sin_port = htons(atoi(argv[2])); int dest_len=sizeof(dest_addr); //发送信息 while(1) { int ret; int bmp_fd; int bmp_size; char *buf; //定位图片 bmp_fd=open(argv[3],O_RDWR); if(bmp_fd==-1) { perror("open bmp failed!
"); return -1; } //将读写位置移到文件尾 bmp_size=lseek(bmp_fd,0,SEEK_END); //printf("bmp_size is:%d
",bmp_size); //为bmp_size申请堆空间 buf=malloc(bmp_size); //将文件指针偏移到开头 lseek(bmp_fd,0,SEEK_SET); //将图片大小读出,放在buf中 read(bmp_fd,buf,bmp_size); //printf("bmp_size is:%d
",bmp_size); //发送图片大小 ret=sendto(client_fd,buf,bmp_size,0,(struct sockaddr *)&dest_addr,dest_len); printf("ret is:%d
",ret); if(ret == -1) { perror("Sendto "); return -1; } else break; close(bmp_fd); } //记得关闭套接字 close(client_fd); return 0; }

서버:
​
​
#include "head.h"


int main(int argc,char*argv[])
{
	if(argc<3)
	{
		//如 ./server 192.168.8.62 8888 
		printf("传参少了,你应该输入 ./main ip port
"); return -1; } int server_id; int bind_id; struct sockaddr_in server_addr,from_addr; //创建套接字 server_id=socket(AF_INET,SOCK_DGRAM,0); if(server_id == -1) { perror("Create server_id failure"); return -1; } //配置参数 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(argv[1]); //ip server_addr.sin_port = htons(atoi(argv[2])); //port int len=sizeof(struct sockaddr_in); //取消端口绑定限制 int opt = 1; if(setsockopt(server_id, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) { perror("setsockopt error"); } //绑定 bind_id=bind(server_id,(struct sockaddr *)&server_addr,len); if(bind_id == -1) { perror("Create bind_id failure"); return -1; }else printf("Bind Success
"); //接收信息 int from_len=sizeof(from_addr); int bmp_fd; int ret; char buf[10000]; bmp_fd=open("/home/lgl/test.bmp",O_CREAT|O_RDWR|O_TRUNC); if(bmp_fd==-1) { printf("create bmp failed!
"); return -1; } ret=recvfrom(server_id,buf,10000,0,NULL,&from_len); printf("ret is:%d
",ret); write(bmp_fd,buf,ret); close(bmp_fd); //关闭套接字 close(server_id); return 0; } ​ ​

 

좋은 웹페이지 즐겨찾기