发 帖  
原厂入驻New
[经验]

关于linuxsocket非阻塞编程问题,server无法收到client的信息?

2011-10-26 17:27:38  1771
分享
0
/* 这是client的code*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define S_PORT 3333
#define BUFFER 100

int main(int argc,char **argv)
{
        struct sockaddr_in server_addr;
        int c_fd,s_fd;
        socklen_t s_len;
        char *buffer = (char *)malloc(BUFFER+1);
        char addr_t[BUFFER];
        int s_bits,r_bits=-1;
        if(argc != 2){
        printf("usage:no valid argument!\n");exit (-1);
        }
        if(!buffer) {perror("malloc");exit (-1);}
        bzero(buffer,BUFFER+1);
        c_fd=socket(AF_INET,SOCK_STREAM,0);
        if(!c_fd){perror("socket");exit (-1);}
        server_addr.sin_port = htons(S_PORT);
        /*inet_pton(AF_INET,argv[1],addr_t);*/
        server_addr.sin_addr.s_addr = inet_addr(argv[1]);
        server_addr.sin_family = AF_INET;
        s_len = sizeof(struct sockaddr_in);
        if((s_fd=connect(c_fd,(struct sockaddr*)&server_addr,s_len))==-1){
        perror("connect");exit (-1);
        }
        gets(buffer);
        s_bits = send(c_fd,buffer,sizeof(buffer),0);
        if(s_bits == sizeof(buffer)){
        printf("success send  to server: %s",buffer);
        }
        else{       
        printf("fail send to server!\n");
        }
        r_bits = recv(c_fd,buffer,sizeof(buffer),0);
        if(r_bits == -1){
        printf("receive from server error!\n");exit (-1);
        }
        else printf("receive from the server : %s\n",buffer);
        if(close(c_fd)==-1){
        printf("close the socket error!\n");exit (-1);
        }
        return 1;
}




/*  这是server的代码*/


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <ctype.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#define S_PORT 3333
#define BUFFER 100
void up_chars(char *buf){
        int i=0;
        while((buf[i]=toupper(buf[i])) != '\0')i++;
}

int
main(void)
{
        struct sockaddr_in server_addr;
        struct sockaddr_in client_addr;
        int s_fd;
        int c_fd;
        socklen_t s_len;
        char *buffer;
        char addr_t[BUFFER];
        int temp;
        int flags;
        if((buffer = (char*)malloc(BUFFER+1)) == NULL){
        fprintf(stderr,"%s",strerror(errno));exit (-1);
        }
        if((s_fd = socket(AF_INET,SOCK_STREAM,0))==-1){
        perror("socket");exit (-1);
        }
        flags = fcntl(s_fd,F_GETFL);
        fcntl(s_fd,F_SETFL,flags |O_NONBLOCK);
        s_len = sizeof(struct sockaddr_in);
        memset(&server_addr,'\0',s_len);
        server_addr.sin_port = htons(S_PORT);
        server_addr.sin_addr.s_addr = INADDR_ANY;
        server_addr.sin_family = AF_INET;
        if(bind(s_fd,(struct sockaddr*)&server_addr,s_len)==-1){
        printf("%s",strerror(errno));;exit(-1);
        }
        if(listen(s_fd,10)==-1){
        printf("%s",strerror(errno));exit (-1);
        }
        while(1){
        int bits;
        /*sleep(1);*/
        c_fd = accept(s_fd,(struct sockaddr*)&client_addr,(socklen_t *)&s_len);
        if(c_fd == -1){
        continue;
        }
        else {
        inet_ntop(AF_INET,&client_addr.sin_addr,addr_t,sizeof(addr_t));
        printf("client ip is %s,port is %d\n",addr_t,ntohs(client_addr.sin_port));
        }
        bits = recv(c_fd,buffer,sizeof(buffer),0);
        if(bits ==-1 && errno != EAGAIN){
        printf("fail to receive from client\n");continue;
        }
        else if(errno = EAGAIN){
        printf("socket is not ready now\n");continue;
        }
        printf("content is : %s\n",buffer);
        up_chars(buffer);
        bits = send(c_fd,buffer,sizeof(buffer),0);
        if(bits == -1 && errno != EAGAIN){
        printf("fail to write\n");exit (-1);
        }
        else if(errno == EAGAIN){
        printf("socket is not ready!\n");continue;
        }
        }
        if(close(s_fd)==-1){
        printf("fail to close\n");exit (-1);
        }       
        return 1;
}


那位高手帮帮忙呢?

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表