SOCKT udp 编程

服务器端:

/*

面向连接的socket客户端通过 调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。

*/

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define MAX_MSG_SIZE 1024

void udps_respon(int sockfd)
{
  struct sockaddr_in addr;
  int addrlen,n;
  char msg[MAX_MSG_SIZE];
  while(1)
 {
   /*从网络上读,并写到网络上*/
   memset(msg,0,sizeof(msg));//初始化,清零
   addrlen=sizeof(struct sockaddr);
   n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen);//从客户端接收消息
   msg[n]='\0';//将接收的字符串加上字符串结束标志

   /*显示服务器已经收到的信息*/
  fprintf(stdout,"Server received %s \n",msg);
   
   
 }
}

int main()
{
  int sockfd;
  struct sockaddr_in addr;
  /*服务器端开始建立socket描述符*/
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
     fprintf(stderr,"socket error :%s \n",strerror(errno));
     exit(1);
   }
   /*服务器端填充sockaddr结构*/
   memset(&addr,0,sizeof(struct sockaddr_in));
   addr.sin_family=AF_INET;
   addr.sin_addr.s_addr=htonl(INADDR_ANY);
   addr.sin_port=htons(SERVER_PORT);
  /*绑定sockfd描述符*/
  if(bind(sockfd,(struct sockaddr*)&addr,sizeof(struct sockaddr_in))<0)
  {
    fprintf(stderr,"Bind Error:%s \n",strerror(errno));
    exit(1);
  }
  udps_respon(sockfd);//进行读写操作
  close(sockfd);
}
/*
#include<sys/types.h>
  #include<sys/socket.h>
  int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
  s:一个标识已连接套接口的描述字。
  buf:用于接收数据的缓冲区。
  len:缓冲区长度。
  flags:指定调用方式。
*/
/*
  函数原型:ssize_t recvfrom(int s,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); ssize_t 相当于 int,socket_t 相当于int ,这里用这个名字为的是提高代码的自说明性。
  参数:
  s:标识一个已连接套接口的描述字。 
  buf:接收数据缓冲区。 
  len:缓冲区长度。 
  flags:调用操作方式。 
  from:(可选)指针,指向装有源地址的缓冲区。 
  fromlen:(可选)指针,指向from缓冲区长度值。
  返回值:
  如果正确接收返回接收到的字节数,失败返回0. 
*/

/*
qust@qust-K42JZ:~/test$ ./udp_server 
break point :ddd
 
Server received ddd
 
break point :dddd
 
Server received dddd
 
^Z
[1]+  已停止               ./udp_server
qust@qust-K42JZ:~/test$ bg
[1]+ ./udp_server &
qust@qust-K42JZ:~/test$ fg
./udp_server
jobs 显示当前暂停的进程
bg fg 默认后台,前台 最后一个进程
bg %1
fg %1
*/
客户端:


#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define SERVER_PORT 8888
#define MAX_BUF_SIZE 1024

void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len)
 {
  char buffer[MAX_BUF_SIZE];
  int n;
  while(1)
  {
    /*从键盘读入,写到服务器*/
    printf("Please input text: \n");
    fgets(buffer,MAX_BUF_SIZE,stdin);
 
    sendto(sockfd,buffer,strlen(buffer),0,(struct sockaddr*)addr,len);
    memset(buffer,0,MAX_BUF_SIZE);
   }
 }

   int main(int argc,char **argv)
 {
   int sockfd;
   struct sockaddr_in addr;
   
    if(argc!=2)
  {
   fprintf(stderr,"NO %s server_ip\n",argv[0]);
   exit(1);
  }
   /*建立sockfd描述符*/
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
  if(sockfd<0)
  {
    fprintf(stderr,"Socket error :%s",strerror(errno));
    exit(1);
  }
  /*填充服务器端*/
  memset(&addr,0,sizeof(struct sockaddr_in));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(SERVER_PORT);
if(inet_aton(argv[1],&addr.sin_addr)<0)//inet_aton将字符串ip转化为网络2进制数字
 {
    fprintf(stderr,"IP error:%s \n",strerror(errno));
    exit(1);
 }
  /*进行读写*/
  udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));
  close(sockfd);
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值