udp的server和client例子程式碼
寫在這裡,方便除錯時使用參考,程式碼如有雷同,純屬巧合
服務端
udp_server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define BUF_SIZE 1024
void handle_udp_msg(int fd)
{
char buf[BUF_SIZE];
socklen_t len;
int count, ret;
struct sockaddr_in client_addr;
struct timeval timeout;
fd_set fds;
#endif
while(1)
{
FD_ZERO(&fds);
FD_SET(fd, &fds);
timeout.tv_sec = 60;
timeout.tv_usec = 0;
memset(buf, 0, BUF_SIZE);
len = sizeof(client_addr);
printf("select start......\n");
ret = select(fd+1, &fds, NULL, NULL, &timeout);
printf("select end..........ret=%d.\n", ret);
#if 0
if(ret == 0)
{
printf("select time out#######continue\n");
continue;
}
if(ret == -1)
{
perror("select error");
break;
}
#endif
if(FD_ISSET(fd,&fds))
count = recvfrom(fd, buf, BUF_SIZE, 0, (struct sockaddr*)&client_addr, &len);
if(count == -1)
{
printf("recieve data fail!\n");
return;
}
printf("recv client:%s\n", buf);
sendto(fd, buf, BUF_SIZE, 0, (struct sockaddr*)&client_addr, len);
}
}
int main(int argc, char* argv[])
{
int server_fd, ret;
struct sockaddr_in ser_addr;
if(argc != 2)
{
printf("Usage: %s <port> \n", argv[0]);
return -1;
}
server_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(server_fd < 0)
{
printf("create socket fail!\n");
return -1;
}
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
ser_addr.sin_port = htons(atoi(argv[1]));
ret = bind(server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr));
if(ret < 0)
{
printf("socket bind fail!\n");
return -1;
}
handle_udp_msg(server_fd);
close(server_fd);
return 0;
}
客戶端
udp_client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define BUF_SIZE 512
void udp_msg_sender(int fd, struct sockaddr* dst)
{
socklen_t len;
struct sockaddr_in src;
char message[BUF_SIZE];
while(1)
{
len = sizeof(*dst);
fputs("Input message:(輸入Q退出):", stdout);
fgets(message, BUF_SIZE, stdin);
if(!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
break;
sendto(fd, message, BUF_SIZE, 0, dst, len);
memset(message, 0, BUF_SIZE);
recvfrom(fd, message, BUF_SIZE, 0, (struct sockaddr*)&src, &len);
printf("recv server message:%s\n",message);
}
}
int main(int argc, char* argv[])
{
int client_fd;
struct sockaddr_in ser_addr;
if(argc != 3)
{
printf("Usage: %s <IP> <port> \n", argv[0]);
return -1;
}
client_fd = socket(AF_INET, SOCK_DGRAM, 0);
if(client_fd < 0)
{
printf("create socket fail!\n");
return -1;
}
memset(&ser_addr, 0, sizeof(ser_addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_addr.s_addr = inet_addr(argv[1]);
ser_addr.sin_port = htons(atoi(argv[2]));
udp_msg_sender(client_fd, (struct sockaddr*)&ser_addr);
close(client_fd);
return 0;
}
呼叫方法
./udp_server port // 啟動服務
./udp_client server_ip port //客戶端訪問服務端
客戶端輸入,服務端接收反饋