服務器:
客戶端:
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//向指定的socket和相應的地址發送消息,成功返回實際發送數據的大小,失敗返回-1設errno
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
dest_addr:目標地址(收件人信息)
addrlen: 目標地址的大小
ANote
//從指定的socket和相應的地址接受消息,並提供來電顯示的功能,成功返回實際接收的數據大小,失敗返回-1設errno
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
src_addr: 結構體指針, 用於保存數據發送方的通信地址
addrlen: 指針類型, 用於保存發送方的地址大小
Note:
recvfrom()的唯一意義就是在udp-server中配合sendto()使用
因為不能通過socket找到對方, 只要是udp發消息, 就得通過sendto()
//udp/ip server 五步走
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main(){
//1. 創建socket
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==sockfd)
perror("socket"),exit(-1);
//2. 准備通信地址
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.s_addr=inet_addr("176.43.11.211");
//3. 綁定socket和通信地址
int res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if(-1==res)
perror("bind"),exit(-1);
printf("bind success\n");
//4. 進行通信
char buf[100]={0};
struct sockaddr_in recv_addr; //為使用recvfrom得到client地址做准備, 最終為sendto()做准備
socklen_t len=sizeof(recv_addr);
res=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr*)&recv_addr,&len);
if(-1==res)
perror("recvfrom"),exit(-1);
char* ip=inet_ntoa(recv_addr.sin_addr); //將recvfrom獲得client地址轉換成點分十進制字符串
printf("data received from client :%s is:%d\n",ip,res);
res=sendto(sockfd,"I received",sizeof("I received"),0,(struct sockaddr*)&recv_addr,len);//使用recvfrom獲得的client地址
if(-1==res)
perror("sendto"),exit(-1);
//5. 關閉socket
res=close(sockfd);
if(-1==res)
perror("close"),exit(-1);
printf("close success\n");
return 0;
}
//udp/ip client
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h> //close()
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
int main(){
int sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==sockfd)
perror("socket"),exit(-1);
printf("create socket succesfully\n");
struct sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.s_addr=inet_addr("176.43.11.211"); //這個是server的地址, 雖然沒有connect, which means 不能通過socket找到這個地址, 但是我們還是知道這個地址的, sendto()是可以直接用的
int res=sendto(sockfd,"hello",sizeof("hello"),0,(struct sockaddr*)&addr,sizeof(addr));
if(-1==res)
perror("sendto"),exit(-1);
printf("data sent size:%d\n",res);
char buf[100]={0};
res=recv(sockfd,buf,sizeof(buf),0);
if(-1==res)
perror("recv"),exit(-1);
printf("data received from server:%s\n",buf);
res=close(sockfd);
if(-1==res)
perror("close"),exit(-1);
return 0;
}