分享

udp使用select

 wusiqi111 2017-12-08
服务器:
#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");
fd_set readfds;
int selectresult;
    while(1)
    {/* 等待接收客户连接请求*/
        FD_ZERO(&readfds);
        FD_SET(ser_sockfd, &readfds);

        selectresult = select(FD_SETSIZE, &readfds, NULL, NULL, NULL);
        if (selectresult <= 0){
            printf("[%S] select error\n",__FUNCTION__);
            usleep(50 * 1000);
            continue;
        }
//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条评论

    发表

    请遵守用户 评论公约

    类似文章 更多