服务器端仅仅打印从客户端受到的字符串。客户端仅仅发一次字符串给服务器端。
#include#include #include #include #include #include #include #define SERV_PORT 9527 //used to throw out an error void sys_err(const char *str){ perror(str); exit(1); } int main(){ int sfd = socket(PF_INET,SOCK_DGRAM,0); //设定用户端的套接字地址 struct sockaddr_in serv_addr;//server socket address serv_addr.sin_family = PF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //这个用来存储客户端的套接字信息,暂时是不知道的 struct sockaddr_in clnt_addr;//client socket address socklen_t lgth_clnt_addr = sizeof(clnt_addr); //缓冲 int rec = 0; char buf[BUFSIZ]; //一些判断 if(sfd == -1){ sys_err("fail to create a socket!"); } if((bind(sfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))) == -1){ sys_err("fail to bind a socket!"); } //服务器真正执行的功能 while(1){ //wait until the arrival of any udp datagram while((rec = recvfrom(sfd,(void *)buf,BUFSIZ,0,(struct sockaddr *)&clnt_addr,&lgth_clnt_addr)) == 0){ //这个函数的用处是接受从客户端来的数据,并且取得客户端的套接字地址。rec为-1时表明接收失败,0和正整数表明接受到的字符数目。sfd为服务器端某socket的文件描述符,buf是用于存放接受的字符串的数组,BUFSIZ是sizeof(buf),0这里是个形参flag(设成0就好),(struct sockaddr*)&clnt_addr是一个传出参数(别忘了前面的强制类型转换)存储客户端套接字的地址,&lgth_clnt_addr也是传出参数存放客户端套接字地址的长度。 } //if any message, print it in the screen write(STDOUT_FILENO,buf,rec); } //关闭套接字 close(sfd); return 0; }
#include程序二#include #include #include #include #include #include #define SERV_PORT 9527 void sys_err(const char *str){ perror(str); exit(1); } int main(){ int cfd = socket(PF_INET,SOCK_DGRAM,0); struct sockaddr_in serv_addr; serv_addr.sin_family = PF_INET; serv_addr.sin_port = htons(SERV_PORT); inet_pton(PF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr); if(cfd == -1){ sys_err("fail to create a socket!"); } // there is no need to bind for cfd --- it's automatic char buf[] = "have fun!n"; sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&serv_addr,sizeof(serv_addr)); return 0; }
在程序一的基础上进行修改,将其改为实现echo功能的UDP通信程序。(即客户端向服务器端发送一个字符,服务器接收这个字符后将其发给客户端)。



