/*client.c*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#define MAXLINE 80
#define PORT 8888
int main(int argc, char *argv[])
{
struct sockaddr_in server_addr, client_addr;
int sock_fd;
int addrlen;
char str[MAXLINE];
char buf[MAXLINE];
char addr[INET_ADDRSTRLEN];
if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("socket");
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, argv[1], &server_addr.sin_addr) < 0)
{
perror("inet_pton");
exit(1);
}
while(fgets(str,MAXLINE,stdin) != NULL)
{
addrlen = sizeof(client_addr);
if(-1 == sendto(sock_fd, str, strlen(str) + 1, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)))
{
perror("sendto");
exit(1);
}
if(-1 == recvfrom(sock_fd, buf, MAXLINE, 0, (struct sockaddr *)&client_addr, &addrlen))
{
perror("recvfrom");
exit(1);
}
inet_ntop(AF_INET, &client_addr.sin_addr, addr, sizeof(addr));
printf("Response from %s port %d:%s\n", addr, ntohs(client_addr.sin_port), buf);
}
}
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
#define MAXLINE 80
#define PORT 8888
int main(int argc, char *argv[])
{
struct sockaddr_in server_addr, client_addr;
int i;
int sock_fd;
int recvlen;
int addrlen;
int buflen;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) //第三个参数一般默认0 ,根据第二个参数socket类型即可判断不用特意指定协议
{
perror("sock");
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if(bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
{
perror("bind");
close(sock_fd);
exit(1);
}
while(1)
{
addrlen = sizeof(client_addr);
if((recvlen = recvfrom(sock_fd, buf, MAXLINE, 0, (struct sockaddr *)&client_addr, &addrlen)) < 0)
{
perror("recvfrom");
exit(1);
}
inet_ntop(AF_INET, &client_addr.sin_addr, str, sizeof(str));
printf("client ip is %s at port %d:%s\n", str, ntohs(client_addr.sin_port), buf);
for(i = 0; i < recvlen; i++)
{
buf[i] = toupper(buf[i]);
}
if(sendto(sock_fd, buf, recvlen, 0, (struct sockaddr *)&client_addr, addrlen) != recvlen)
{
perror("sendto");
exit(1);
}
}
}
先打开一个Terminal 运行server 再打开一个Terminal 运行client ./client 127.0.0.1(服务器的ip地址)