一、示例1: 往网络调试助手发送信息
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define N 128
//ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
/*
struct sockaddr_in {
short int sin_family; /
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
*/
int main()
{
int sockfd = 0;
//1、创建套接字
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
perror("fail to socket");
exit(1);
}
printf("sockfd = %d\n", sockfd);
//2、填充服务器网络信息结构体 sockaddr_in
struct sockaddr_in severaddr;
socklen_t addrlen = sizeof(severaddr);
//IPv4网络
severaddr.sin_family = AF_INET;
//将一个点分十进制的IP转换成一个长整数型数
severaddr.sin_addr.s_addr = inet_addr("192.168.43.84");
//从主机字节顺序转变成网络字节(大端存储)
severaddr.sin_port = htons(22222);
//3、发送数据到服务器
char buf[N] = "";
while(1){
fgets(buf, N, stdin);
buf[strlen(buf) - 1] = '\0';
if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&severaddr, addrlen) == -1){
perror("fail to sendto");
exit(1);
}
}
//4、关闭套接字文件描述符
close(sockfd);
return 0;
}
二、示例2:
网络调试助手为客户端,树莓派为服务器端。
客户端发送信息给服务器,服务器打印发送的信息,和打印发送者的IP地址和端口号。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define N 128
/*
struct sockaddr_in {
short int sin_family; /
unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
*/
//int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
int main()
{
int sockfd = 0;
//1、创建套接字
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
perror("fail to socket");
exit(1);
}
printf("sockfd = %d\n", sockfd);
//2、填充网络信息结构体
struct sockaddr_in severaddr;
severaddr.sin_family = AF_INET;
severaddr.sin_port = htons(8888);
severaddr.sin_addr.s_addr = inet_addr("192.168.43.32");
//3、绑定服务器的网络信息,让客户端能够找到
if( bind(sockfd, (struct sockaddr *)&severaddr, (sizeof(severaddr))) == -1){
perror("fail to bind");
exit(1);
}
//ssize_t recvfrom(int sockfd, void *buf, size_t len, int flag, struct sockaddr *src_addr, socklen_t *addrlen)
char buf[N] = "";
struct sockaddr_in clientaddr;
//4、接收网络调试助手的数据
socklen_t clientaddrlen = sizeof(struct sockaddr_in);
if( recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&clientaddr, &clientaddrlen) == -1){
//没有数据会阻塞
perror("fail to recvfrom");
exit(1);
}
printf("client ip is %s\n", inet_ntoa(clientaddr.sin_addr));
printf("post is %d\n", ntohs(clientaddr.sin_port));
printf("buf is %s\n", buf);
//5、关闭套接字文件描述符
close(sockfd);
return 0;
}