生活随笔
收集整理的這篇文章主要介紹了
套接字编程——基于UDP协议
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《UDP用到的大多數函數在上一片TCP中已講解,這兒就不再重復了,只有接受和發送所用的函數不同》
函數
(1)接受——recvfrom()
(2)發送——sendto()
a. 參數
sockfd:?表示一個已經建立的socket編號(描述符);
buf: 接受數據的緩沖區;
len:?緩沖區的大小;
flags: 調用操作方式,當設為0時,表示用阻塞方式接收;
src_addr: 發送方網絡地址信息,指向裝有發送方地址的緩存區; ?
addrlen: 指向src_addr緩存區長度值;
b. 返回值
? ?成功返回讀入/發送的字節數,失敗返回-1。
2. 程序實現圖
(1). 服務器的工作流程:首先調用socket函數創建一個Socket,然后調用bind函數將其與本機地址以及一個本地端口號綁定,接收到一個客戶端時,服務器顯示該客戶端的IP地址,并將字串返回給客戶端。
(2). 客戶端的工作流程:首先調用socket函數創建一個Socket,填寫服務器地址及端口號,從標準輸入設備中取得字符串,將字符串傳送給服務器端,并接收服務器端返回的字符串。最后關閉該socket。 ?
3. 程序實現
//udp_server.c1?#include<stdio.h>2?#include<stdlib.h>3?#include<string.h>4?#include<netinet/in.h>5?#include<sys/types.h>6?#include<sys/socket.h>7?8?void?usage(const?char*?argv)9?{???10?????printf("%s?[ip]?[port]\n",argv);11?????exit(0);12?}13?static?int?startup(int?ip,int?port)14?{???15?????//創建套接字16?????int?sock=socket(AF_INET,SOCK_DGRAM,0);17?????if(sock<0)18?????{19?????????perror("socket");20?????????exit(1);21?????}22?????//設置socket23?????struct?sockaddr_in?local;24?????local.sin_family=AF_INET;25?????local.sin_port=htons(port);26?????local.sin_addr.s_addr=inet_addr(ip);27?????//綁定28?????if(bind(sock,(struct?sockaddr*)&local,sizeof(local))<0)29?????{30?????????perror("bind");31?????????exit(2);32?????}33?????return?sock;34?}35?int?main(int?argc,char*?argv[])36?{37?????if(argc!=3)38?????{39?????????usage(argv[0]);40?????????exit(3);41?????}42?????int?r_ip=argv[1];43?????int?r_port=atoi(argv[2]);44?45?????int?server_sock=startup(r_ip,r_port);46?????if(server_sock<0)47?????{48?????????perror("startup");49?????????exit(4);50?????}51?52?????char?buf[1024];53?????struct?sockaddr_in?client;54?????socklen_t?len?=sizeof(client);55?????while(1)56?????{57?????????memset(buf,'\0',sizeof(buf));58?????????ssize_t?size?=?recvfrom(server_sock,buf,sizeof(buf)-1,0,\(struct?sock?addr*)&client,&len);59?????????if(size<0)60?????????{61?????????????perror("recvform");62?????????????exit(1);63?????????}64?????????printf("client?[%s]?[%d]#?%s\n",inet_ntoa(client.sin_addr),\ntohs(client.sin_port),buf);65?????}66?????return?0;67?}//udp_client.c1?#include<stdio.h>2?#include<stdlib.h>3?#include<string.h>4?#include<netinet/in.h>5?#include<sys/types.h>6?#include<sys/socket.h>7?void?usage(const?char*?argv)8?{???9?????printf("%s?[ip]?[port]\n",argv);10?????return?;11?}12?int?main(int?argc,char*?argv[])13?{14?????if(argc!=3)15?????{16?????????usage(argv[0]);17?????????exit(1);18?19?????}20?21?????char*?r_ip=argv[1];22?????int?r_port=atoi(argv[2]);23?24?????int?sock=socket(AF_INET,SOCK_DGRAM,0);25?????if(sock<0)26?????{27?????????perror("socket");28?????????exit(2);29?????}30?31?????struct?sockaddr_in?remote;32?????remote.sin_family=AF_INET;33?????remote.sin_port=htons(r_port);34?????remote.sin_addr.s_addr=inet_addr(r_ip);35?36?????char?buf[1024];37?????while(1)38?????{39?????????memset(buf,'\0',sizeof(buf));40?????????printf("client:?");41?????????fflush(stdout);42?????????gets(buf);43?????????ssize_t?_s=sendto(sock,buf,sizeof(buf),0,\(struct?sockaddr*)&remote,sizeof(remote));44?????????if(_s<0)45?????????{46?????????????perror("sendto");47?????????????exit(3);48?????????}49?????}50?????return?0;51?}//start.sh1?#!/bin/bash2?3?./udp_server?192.168.163.128?8080//makefile1?.PHONY:all2?all:udp_client?udp_server3?udp_client:udp_client.c4?????gcc?-o?$@?$^5?udp_server:udp_server.c6?????gcc?-o?$@?$^?7?.PHONY:clean8?clean:9?????rm?-f?udp_client?udp_server
輸出結果:
udp_server.c:
udp_client.c:
轉載于:https://blog.51cto.com/10707460/1782321
總結
以上是生活随笔為你收集整理的套接字编程——基于UDP协议的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。