服务器代码 udpserv01.c:
#include "unp.h"
int main(int argc, char **argv)
{
intsockfd;
struct sockaddr_inservaddr, cliaddr;
sockfd = Socket(AF_INET, SOCK_DGRAM,0);//创建socket
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
Bind(sockfd, (SA *) &servaddr,sizeof(servaddr));//绑定socket
dg_echo(sockfd, (SA *) &cliaddr,sizeof(cliaddr));//具体处理和客户端之间的通信
}
#include "unp.h"
void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{
intn;
socklen_tlen;
charmesg[MAXLINE];
for ( ; ; ) {
len = clilen;
n = Recvfrom(sockfd, mesg, MAXLINE,0, pcliaddr, &len);//获取客户端发来的消息
Sendto(sockfd, mesg, n,0, pcliaddr, len);//发送消息给客户端
}
}
#include "unp.h"
int main(int argc, char **argv)
{
intsockfd;
struct sockaddr_inservaddr;
if (argc !=2)
err_quit("usage: udpcli <IPaddress>");
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);//转换格式
sockfd = Socket(AF_INET, SOCK_DGRAM,0);//创建socket
dg_cli(stdin, sockfd, (SA *) &servaddr,sizeof(servaddr)); //具体处理和服务器的通信
exit(0);
}
#include "unp.h"
void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{
intn;
charsendline[MAXLINE], recvline[MAXLINE + 1];
while (Fgets(sendline, MAXLINE, fp) !=NULL) { //从输入设备获取信息
Sendto(sockfd, sendline, strlen(sendline),0, pservaddr, servlen);//向服务器发送信息
n = Recvfrom(sockfd, recvline, MAXLINE,0, NULL, NULL); //接受服务器发来的信息
recvline[n] = 0;/* null terminate */
Fputs(recvline, stdout);//显示到输出设备
}
}
➜ udpcliserv ./udpserv01
➜ udpcliserv ./udpcli01 127.0.0.1
sh-3.2# tcpdump -i lo0 port 9877
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
➜ udpcliserv ./udpcli01 127.0.0.1
hello
hello
sh-3.2# tcpdump -i lo0 port 9877
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 65535 bytes
15:08:06.567545 IP localhost.57676 > localhost.9877: UDP, length 6
15:08:06.567653 IP localhost.9877 > localhost.57676: UDP, length 6
客户端和服务器谁先启动都无所谓,但是注意的一点,如果客户端先启动了,并且发送了消息,此时服务器还未启动,那么客户端会阻塞,即便当服务器启动了之后,客户端也一直会阻塞!