服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#define MAXSIZE 512
#define SERVER_PORT 12355
#define SEND_PORT 12377
int main()
{
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
char buff[MAXSIZE];
char ip[INET_ADDRSTRLEN];
int i, len;
/*创建socket*/
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
/*设置广播属性*/
int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
/*绑定端口号*/
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
printf("Udp Server Start ...\n");
while(1)
{
/*接收客户端信息*/
client_addr_len = sizeof(client_addr);
len = recvfrom(sockfd, buff, MAXSIZE, 0, (struct sockaddr*)&client_addr, &client_addr_len);
if(len == -1)
{
printf("recvfrom error\n");
}
/*打印客户端ip,port*/
inet_ntop(AF_INET, &client_addr.sin_addr, ip, sizeof(ip));
int rcv_port = ntohs(client_addr.sin_port);
printf("Received info from %s at PORT %d\n",ip,rcv_port);
for(i = 0; i < len; i++)
{
buff[i] = toupper(buff[i]);
}
/*设置发送端口*/
client_addr.sin_port = htons(SEND_PORT);
/*发送信息到客户端*/
len = sendto(sockfd, buff, len, 0, (struct sockaddr*)&client_addr, sizeof(client_addr));
if(len == -1)
{
printf("sendto error!\n");
}
}
close(sockfd);
return 0;
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MAXSIZE 512
#define SERVER_PORT 12355
#define RECV_PORT 12377
#define IP "255.255.255.255"
int main(int argc, char* argv[])
{
char buff[MAXSIZE];
/*创建socket,设置广播属性*/
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
int on = 1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
/*绑定接收端口*/
struct sockaddr_in rcv_addr;
bzero(&rcv_addr, sizeof(rcv_addr));
rcv_addr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &rcv_addr.sin_addr);
rcv_addr.sin_port = htons(RECV_PORT);
bind(sockfd,(struct sockaddr*)&rcv_addr,sizeof(rcv_addr));
/*设置发送到服务器的IP,端口等信息*/
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
inet_pton(AF_INET, IP, &server_addr.sin_addr);
server_addr.sin_port = htons(SERVER_PORT);
printf("Udp Client Start....\n");
while(fgets(buff, MAXSIZE, stdin) != NULL)
{
/*发送信息到服务器*/
int ret = sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(-1 == ret)
{
printf("sendto error!\n");
}
/*接收服务器返回信息*/
ret = recvfrom(sockfd, buff, MAXSIZE, 0, NULL, 0);
if(-1 == ret)
{
printf("recvfrom error!\n");
}
write(STDOUT_FILENO, buff, ret);
}
close(sockfd);
return 0;
}