//
// Created by 冰糖葫芦的夏天 on 16-7-15.
// server_udp.c
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <memory.h>
#define LISTENPORT 12345 //定义监听端口号
#define LISTENIP "127.0.0.1" //定义监听IP地址
int main()
{
int mysock, len, addr_client_len;
struct sockaddr_in addr_server; //定义一个服务端的结构体
struct sockaddr_in addr_client; //定义一个客户端的结构体
char msg[256]; //存储传输的数据
mysock = socket(AF_INET, SOCK_DGRAM, 0); //建立套接字
if (mysock != -1) {
printf("[+] 建立套接字成功\n");
}
printf("[+] UDP监听端口: %d\n", LISTENPORT);
printf("[+] UDP监听IP: %s\n", LISTENIP);
memset(&addr_server, 0, sizeof(addr_server)); //清空服务端套接字
memset(&addr_client, 0, sizeof(addr_client)); //清空客户端套接字
addr_server.sin_family = AF_INET; //设置地址类型
addr_server.sin_port = htons(LISTENPORT); //设置服务端监听端口
addr_server.sin_addr.s_addr = inet_addr(LISTENIP); //设置服务端监听ip地址
addr_client_len = sizeof(addr_client); //计算客户端结构体大小
if (0 == bind(mysock, (const struct sockaddr *) &addr_server, sizeof(addr_server))) {
//绑定端口
printf("[+] 监听端口绑定成功\n");
}
else {
perror("[+] binderror"); //绑定错误处理
return 0;
}
while (1){ //循环接受客户端发来的信息
memset(msg, 0, sizeof(msg)); //清空保存信息的内存
len = (int) recvfrom(mysock, msg, sizeof(msg), 0, (struct sockaddr *) &addr_client, (socklen_t *) &addr_client_len); //接受信息
if (len == -1) perror("[+] recverror"); //接受错误处理
printf("[%d]%s: %s\n", len, inet_ntoa(addr_client.sin_addr), msg);
//打印接收到的信息
}
return 0;
}
------------------------我是分割线--------------------------
//
// Created by 冰糖葫芦的夏天 on 16-7-15.
//client_udp.c
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <memory.h>
#define REMOTEIP "127.0.0.1" //要发送的ip地址
#define REMOTEPORT 12345 //要发送的端口
int main()
{
int mysock, len;
char msg[256]; //定义一个存储发送消息的内存
struct sockaddr_in addr; //定义存储端口,ip信息结构体
memset(&addr, 0, sizeof(&addr)); //清空这个结构体
mysock = socket(AF_INET, SOCK_DGRAM, 0); //建立套接字
if (mysock != -1) {
printf("[+] 建立套接字成功\n");
printf("[+] 套接字ID: %d\n", mysock);
printf("[+] 远程主机IP: %s\n", REMOTEIP);
printf("[+] 远程主机端口: %d\n", REMOTEPORT);
}
addr.sin_family = AF_INET; //结构体中填入地址类型
addr.sin_port = htons(REMOTEPORT); //结构体中填入要发送到的端口
addr.sin_addr.s_addr = inet_addr(REMOTEIP); //结构体中填入要发送到ip地址
while (1) {
memset(msg, 0, sizeof(msg)); //清空消息内存
printf("请输入: ");
scanf("%s", msg); //等待用户输入要发送的信息
len = (int) sendto(mysock, msg, sizeof(msg), 0, (const struct sockaddr *) &addr, sizeof(addr)); //发送消息
if (len != -1) printf("[+] 消息发送成功\n");
else {
printf("[+] 发送失败\n");
return 0;
}
}
return 0;
}
/*
注:在recvfrom函数中
int recvfrom(int s, void *buf, int len, unsigned int flags, struct sockaddr *from,int *fromlen)
s: 建立的socket编号
buf: 接收到的信息存储在哪块内存里
len: 存储接收信息的内存的大小,通过sizeof()获取
flags: 一般设置为0,可选参数为: MSG_OOB: 传出的数据以out-of-band送出
MSG_DONTROUTE: 取消路由表查询
MSG_DONTWAIT: 设置为不可阻断
MSG_NOSIGNAL: 此传输不愿被SIGPIPE信号中断
sockaddr: 存储数据(来源)的结构体,数据存储方式和sockaddr_in一样,具体自行百度
fromlen: 上面这个结构体的大小,通过sizeof获取,注意:sizeof获取到的是int,需要先赋一个变量,然后对这个变量取地址
注意:这里是数据(来源)的结构体,要定义两个结构体的,否则填错结构体,将出现bad address错误
也可以在recvfrom函数的sockaddr里填NULL,此时第5个参数将被忽略,不会出现bad address错误,但是,将无法显示数据来源地址与端口
*/
linux下c语言udp连接实例
最新推荐文章于 2024-09-07 12:47:36 发布