再讲点简单的udp
服务器端程序
客户端程序
上面这两个程序都是来自张炯的作品《unix网络编程实用技术与实例分析》,我不要要推崇这个人的作品,我是要鄙视这本书,给得源码不是这有问题,就是那有问题,根本就不是一个负责任的态度
// udpserver.c
#include <stdio.h>
#include <strings.h> /* for bzero() */
#include <unistd.h> /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>
#define PORT 1234 //将会被打开的端口
#define MAXDATASIZE 100 //最大的数据长度
int main()
{
int sockfd;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
int num;
char msg[MAXDATASIZE];
//socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror( "Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//bind
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
{
perror( "Bind error.");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while (1)
{
//recvfrom
num = recvfrom(sockfd,msg,MAXDATASIZE,0,(struct sockaddr *)&client,&sin_size);
if (num < 0)
{
perror( "recvfrom error\n");
exit(1);
}
msg[num] = '\0';
printf( "server:You got a message (%s) from %s\n",msg,inet_ntoa(client.sin_addr) );
//sendto
sendto(sockfd, "Welcome to my server.........\n",30,0,(struct sockaddr *)&client,sin_size);
if (!strcmp(msg, "quit")) break;
}
//close
close(sockfd);
}
#include <stdio.h>
#include <strings.h> /* for bzero() */
#include <unistd.h> /* for close() */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <arpa/inet.h>
#define PORT 1234 //将会被打开的端口
#define MAXDATASIZE 100 //最大的数据长度
int main()
{
int sockfd;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
int num;
char msg[MAXDATASIZE];
//socket
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror( "Creating socket failed.");
exit(1);
}
int opt = SO_REUSEADDR;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
//bind
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr = htonl (INADDR_ANY);
if (bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1)
{
perror( "Bind error.");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
while (1)
{
//recvfrom
num = recvfrom(sockfd,msg,MAXDATASIZE,0,(struct sockaddr *)&client,&sin_size);
if (num < 0)
{
perror( "recvfrom error\n");
exit(1);
}
msg[num] = '\0';
printf( "server:You got a message (%s) from %s\n",msg,inet_ntoa(client.sin_addr) );
//sendto
sendto(sockfd, "Welcome to my server.........\n",30,0,(struct sockaddr *)&client,sin_size);
if (!strcmp(msg, "quit")) break;
}
//close
close(sockfd);
}
// File: prg5_2.c
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h> // for struct hostent
#define PORT 1234 //远程服务器上的那个端口
#define MAXDATASIZE 100 /* Max number of bytes of data */
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server,reply;
if (argc !=3)
{
printf( "Usage: %s <IP Address> <message>\n",argv[0]);
exit(1);
}
if ((he=gethostbyname(argv[1]))== NULL)
{
printf( "gethostbyname() error\n");
exit(1);
}
//socket
if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0))==-1)
{
printf( "socket() error\n");
exit(1);
}
//sendto
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT); /* htons() is needed again */
server.sin_addr = *((struct in_addr *)he->h_addr);
sendto(sockfd, argv[2], strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(struct sockaddr));
while (1)
{
int len;
//recvfrom
if ((numbytes=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&reply,& len)) == -1)
{
printf( "recvfrom error\n");
exit(1);
}
printf( "len=%d\n", len);
printf( "sizefo(struct sockaddr)=%d\n",sizeof(struct sockaddr));
printf( "server.sin_addr=%s\n",inet_ntoa(server.sin_addr));
printf( "reply.sin_addr=%s\n",inet_ntoa(reply.sin_addr));
/*
if ( len != sizeof(struct sockaddr) || memcmp(( const void *)&server, ( const void *)&reply, len) != 0)
{
printf( "Receive message from other server.\n");
continue;
}
*/
buf[numbytes]= '\0';
printf( "Server Message: %s\n",buf);
break;
}
//close
close(sockfd); /* close fd */
}
#include <stdio.h>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#include <netdb.h> // for struct hostent
#define PORT 1234 //远程服务器上的那个端口
#define MAXDATASIZE 100 /* Max number of bytes of data */
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server,reply;
if (argc !=3)
{
printf( "Usage: %s <IP Address> <message>\n",argv[0]);
exit(1);
}
if ((he=gethostbyname(argv[1]))== NULL)
{
printf( "gethostbyname() error\n");
exit(1);
}
//socket
if ((sockfd=socket(AF_INET, SOCK_DGRAM, 0))==-1)
{
printf( "socket() error\n");
exit(1);
}
//sendto
bzero(&server,sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(PORT); /* htons() is needed again */
server.sin_addr = *((struct in_addr *)he->h_addr);
sendto(sockfd, argv[2], strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(struct sockaddr));
while (1)
{
int len;
//recvfrom
if ((numbytes=recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&reply,& len)) == -1)
{
printf( "recvfrom error\n");
exit(1);
}
printf( "len=%d\n", len);
printf( "sizefo(struct sockaddr)=%d\n",sizeof(struct sockaddr));
printf( "server.sin_addr=%s\n",inet_ntoa(server.sin_addr));
printf( "reply.sin_addr=%s\n",inet_ntoa(reply.sin_addr));
/*
if ( len != sizeof(struct sockaddr) || memcmp(( const void *)&server, ( const void *)&reply, len) != 0)
{
printf( "Receive message from other server.\n");
continue;
}
*/
buf[numbytes]= '\0';
printf( "Server Message: %s\n",buf);
break;
}
//close
close(sockfd); /* close fd */
}
我看APUE就没有这么多的问题!
执行:
udpserver &
udpclient 127.0.0.1 yy
打印为:
server:You got a message (yy) from 127.0.0.1
len=16
sizefo(struct sockaddr)=16
server.sin_addr=127.0.0.1
reply.sin_addr=0.0.0.0
Server Message: Welcome to my server.........
大家也看到了,我在client中注释掉了一个if,作者的意思的是因为udp的recvfrom中指不定是接受谁的信息(确实),所以在这里鉴定一下服务器,返回的应该和server端的一样,我就下午看了一会儿,反正我是没明白,我的返回0.0.0.0,如果是其他的IP的那我明白,自然就不是这个主机,可是如果是这个主机的返回的也是0.0.0.0,也不是127.0.0.1呀,作者没说明白,看来是我太傻了
睡觉
转载于:https://blog.51cto.com/nnssll/201533