简单udp服务器和客户端
server.c
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#define PRINT_ERR(msg) \
do { \
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__); \
perror(msg); \
exit(-1); \
} while (0)
int main(int argc, const char *argv[]) {
if (argc < 3) {
printf("please input ip , port\n");
return -1;
}
int sfd;
if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
PRINT_ERR("scoket create error");
}
struct sockaddr_in sockaddrIn;
sockaddrIn.sin_port = htons(atoi(argv[2]));
sockaddrIn.sin_family = AF_INET;
sockaddrIn.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t socklen = sizeof(sockaddrIn);
if (bind(sfd, (struct sockaddr*)&sockaddrIn, socklen) < 0) {
PRINT_ERR("bind error");
}
struct sockaddr_in client_sockaddrIn;
socklen_t client_socklen = sizeof(client_sockaddrIn);
char buf[128] = {0};
while (1) {
memset(buf, 0, sizeof(buf));
memset(&client_sockaddrIn, 0, sizeof(client_sockaddrIn));
if (recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&client_sockaddrIn, &client_socklen) < 0) {
PRINT_ERR("recv from error");
}
printf("client [%s: %d] message -->%s\n", inet_ntoa(client_sockaddrIn.sin_addr), htons(client_sockaddrIn.sin_port), buf);
if (!strncmp(buf, "quit", 4)) {
printf("client [%s: %d] exit!!!\n", inet_ntoa(client_sockaddrIn.sin_addr), htons(client_sockaddrIn.sin_port));
}
strcat(buf, "--hi!!!");
sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&client_sockaddrIn, client_socklen);
}
return 0;
}
client.c
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#define PRINT_ERR(msg) do{\
printf("%s:%s:%d\n", __FILE__, __func__, __LINE__);\
perror(msg);\
exit(-1);\
}while(0)
int main(int argc, const char *argv[]) {
if (argc < 3) {
printf("please input ip , port\n");
return -1;
}
int sfd;
if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
PRINT_ERR("scoket create error");
}
struct sockaddr_in sockaddrIn;
sockaddrIn.sin_port = htons(atoi(argv[2]));
sockaddrIn.sin_family = AF_INET;
sockaddrIn.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t socklen = sizeof(sockaddrIn);
char buf[128] = {0};
while (1) {
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if (sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sockaddrIn, socklen) < -1) {
PRINT_ERR("send to error");
}
if (!strncmp(buf, "quit", 4)) {
break;
}
memset(buf, 0, sizeof(buf));
recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL);
printf("receive server message --> %s\n", buf);
}
close(sfd);
return 0;
}
运行结果
client
ubuntu:ubuntu $ ./client 192.168.10.126 8888
1
receive server message --> 1--hi!!!
nihao
receive server message --> nihao--hi!!!
quit
ubuntu:ubuntu $
server
ubuntu:ubuntu $ ./server 192.168.10.126 8888
client [192.168.10.126: 55724] message -->1
client [192.168.10.126: 55724] message -->nihao
client [192.168.10.126: 55724] message -->quit
client [192.168.10.126: 55724] exit!!!
^C
ubuntu:ubuntu $