Skip to content

Commit 5090503

Browse files
author
shineyr
committed
基本套接字编程—— -- UDP回射程序
1 parent 9fc73bd commit 5090503

2 files changed

Lines changed: 122 additions & 0 deletions

File tree

udp_socket/client.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <sys/socket.h>
5+
#include <netinet/in.h>
6+
7+
8+
const int SERV_PORT = 6000;
9+
10+
const int MAXLINE = 2048;
11+
void dg_cli(FILE *fp , int sockfd , const struct sockaddr *pservaddr , socklen_t servlen)
12+
{
13+
int n;
14+
char sendline[MAXLINE] , recvline[MAXLINE+1];
15+
16+
while(fgets(sendline , MAXLINE , fp) != NULL)
17+
{
18+
if(sendto(sockfd , sendline , strlen(sendline) , 0 , pservaddr , servlen) < 0)
19+
{
20+
perror("sendto error");
21+
exit(1);
22+
}//if
23+
24+
if( ( n = recvfrom(sockfd , recvline , MAXLINE , 0 , NULL , NULL)) < 0)
25+
{
26+
perror("recvfrom error");
27+
exit(1);
28+
}//if
29+
30+
recvline[n] = '\0';
31+
fputs(recvline , stdout);
32+
33+
}//while
34+
}
35+
36+
int main(int argc , char **argv)
37+
{
38+
int sockfd , t;
39+
struct sockaddr_in servaddr;
40+
if(argc != 2)
41+
{
42+
perror("usage: udpcli <IPaddress>");
43+
exit(1);
44+
}//if
45+
46+
bzero(&servaddr , sizeof(servaddr));
47+
servaddr.sin_family = AF_INET;
48+
servaddr.sin_port = htons(SERV_PORT);
49+
if((t = inet_pton(AF_INET , argv[1], &servaddr.sin_addr)) <= 0)
50+
{
51+
perror("inet_pton error");
52+
exit(1);
53+
}//if
54+
55+
if((sockfd = socket(AF_INET , SOCK_DGRAM , 0)) < 0)
56+
{
57+
perror("socket error");
58+
exit(1);
59+
}//if
60+
61+
dg_cli(stdin , sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr));
62+
exit(0);
63+
}
64+

udp_socket/server.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <sys/socket.h>
4+
#include <string.h>
5+
#include <sys/types.h>
6+
#include <netinet/ip.h>
7+
8+
const int SERV_PORT = 6000;
9+
const int MAXLINE = 2048;
10+
11+
void dg_echo(int sockfd , struct sockaddr *pcliaddr , socklen_t clilen)
12+
{
13+
int n;
14+
socklen_t len;
15+
char mesg[MAXLINE];
16+
17+
for( ; ;)
18+
{
19+
len = clilen;
20+
if((n = recvfrom(sockfd , mesg , MAXLINE , 0 , pcliaddr , &len))<0)
21+
{
22+
perror("recvfrom error");
23+
exit(1);
24+
}//if
25+
26+
if((n = sendto(sockfd , mesg , n , 0 , pcliaddr , len)) < 0)
27+
{
28+
perror("sendto error");
29+
exit(1);
30+
}//if
31+
}//for
32+
33+
}
34+
35+
int main(int argc , char **argv)
36+
{
37+
int sockfd;
38+
struct sockaddr_in servaddr , cliaddr;
39+
40+
bzero(&servaddr , sizeof(servaddr));
41+
servaddr.sin_family = AF_INET;
42+
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
43+
servaddr.sin_port = htons(SERV_PORT);
44+
45+
if((sockfd = socket(AF_INET , SOCK_DGRAM , 0)) < 0)
46+
{
47+
perror("socket error");
48+
exit(1);
49+
}//if
50+
51+
if(bind(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr)))
52+
{
53+
perror("bind error");
54+
exit(1);
55+
}//if
56+
57+
dg_echo(sockfd , (struct sockaddr *)&cliaddr , sizeof(cliaddr));
58+
}

0 commit comments

Comments
 (0)