分享

udp客户端和服务代码

 wusiqi111 2017-12-07

sendto函数:

表头文件

#include < sys/types.h >
  #include < sys/socket.h >

定义函数

  int sendto ( socket s , const void * msg, int len, unsigned int flags, const
  struct sockaddr * to , int tolen ) ;

函数说明

  sendto() 用来将数据由指定的socket传给对方主机。参数s为已建好连线的socket,如果利用UDP协议则不需经过连线操作。参数msg指向欲连线的数据内容,参数flags 一般设0,详细描述请参考send()。
参数to用来指定欲传送的网络地址,结构sockaddr请参考bind()。参数tolen为sockaddr的结构长度。

返回值

  成功则返回实际传送出去的字符数,失败返回-1,错误原因存于errno 中。

recvfrom 函数原型:
    int recvfrom(int socket,  void *buffer,  size tsize,  int flags,  struct sockaddr *addr,  socklen t *length-ptr)
    这个void *buffer是进程用户空间地址,可以是栈上的地址,也可以是你用malloc创建的堆地址。struct sockaddr *addr,  socklen t *length-ptr 分别用来存储对端的地址信息和长度,
注意这个长度用的是指针表示,别弄错了。

服务端:
#include <stdio.h>
#include <sys/select.h>

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<errno.h>
#define MAX_MSG_SIZE 1024

int main()
    int ser_sockfd,cli_sockfd; /*sock_fd:监听socket;client_fd:数据传输socket */ 
    struct sockaddr_in ser_addr; /* 本机地址信息 */ 
    struct sockaddr_in cli_addr; /* 客户端地址信息 */ 
    char msg[MAX_MSG_SIZE];/* 缓冲区*/
memset(&cli_addr, 0,sizeof(cli_addr));
socklen_t len = sizeof(cli_addr);
    ser_sockfd=socket(AF_INET,SOCK_DGRAM,0);/*创建连接的SOCKET */
    if(ser_sockfd<0)
    {/*创建失败 */
        fprintf(stderr,"socker Error:%s\n",strerror(errno));
       return 0;
    } 
    /* 初始化服务器地址*/
    int addrlen=sizeof(struct sockaddr_in);
    bzero(&ser_addr,addrlen);
    ser_addr.sin_family=AF_INET;
    ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1");   
    ser_addr.sin_port=htons(8888);
    if(bind(ser_sockfd,(struct sockaddr*)&ser_addr,sizeof(struct sockaddr_in))<0)
    { /*绑定失败 */
        fprintf(stderr,"Bind Error:%s\n",(char *)strerror(errno));
        return 0;
    } 
printf("enter while\n");
    while(1)
    {/* 等待接收客户连接请求*/
//int length = recvfrom(ser_sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&cli_addr, sizeof(struct sockaddr_in)); //错误sizeof(struct sockaddr_in)下发要是地址
         int length = recvfrom(ser_sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&cli_addr, &len); /* 接受数据*/
           // printf("received a connection from ip=%s,port=%d\n", inet_ntoa(cli_addr.sin_addr.s_addr),ntohs(cli_addr.sin_port));
 printf("length=%d\n",length);
// printf("recvfrom Error:%d\n",errno);
if(length > 0){
            printf("%s\n",msg);/*在屏幕上打印出来 */ 
            strcpy(msg,"hi,I am server!");
            sendto(ser_sockfd,msg,strlen(msg),0,(struct sockaddr*)&cli_addr, sizeof(cli_addr)); /*发送的数据*/
}

    }
    close(ser_sockfd);
}
客户端:
#include <stdio.h>
#include <sys/select.h>

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>


int main(int argc, char* argv[])  
{  
int addrlen=sizeof(struct sockaddr_in);
    int sclient = socket(AF_INET, SOCK_DGRAM, 0);  
int i = 10;
    if(sclient < 0)  
    {  
        printf("invalid socket !");  
        return 0;  
    }  
  
struct sockaddr_in serAddr,cAddr;  
    serAddr.sin_family = AF_INET;  
    serAddr.sin_port = htons(8888);  
    serAddr.sin_addr.s_addr = inet_addr("127.0.0.1");   
  memset(&cAddr, 0,sizeof(cAddr));
socklen_t len = sizeof(cAddr);
    char * sendData = " hello tcp server i am  client\n";  
while(i > 0){
int length = sendto(sclient, sendData, strlen(sendData),0, (struct sockaddr*)&serAddr, sizeof(serAddr));  
printf("sendto data length=%d\r\n",length);  
char recData[255];  
int ret = recvfrom(sclient, recData, 255,0, (struct sockaddr*)&cAddr, &len);  
if(ret > 0)  
{  
  recData[ret] = 0x00;  
  printf("recData=%s\r\n",recData);  
}  
sleep(1);
i--;
}

    close(sclient);  

    return 0;  
}  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多