免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1546 | 回复: 1
打印 上一主题 下一主题

socket客户端向服务端发信的的问: [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-24 18:55 |只看该作者 |倒序浏览
如题,以下是我的测试源码,当连上之后服务端向客户端发信,客户端收信成功,可是返过来为什么不行了呢,找过很多资料,真的不行了,请大家帮忙:
server.c:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 3490    /* the port users will be connecting to */
#define BACKLOG 10     /* how many pending connections queue will hold */
main()
{
    int sockfd, new_fd,new_fd2;  /* listen on sock_fd, new connection on new_fd */
    struct sockaddr_in my_addr;    /* my address information */
    struct sockaddr_in their_addr; /* connector's address information */
    unsigned long sin_size;
    int numbytes;  
    char buf[100];
    fd_set          readfsd;        /* 検査ディスクリプタ指定   */
       
       
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0 )) == -1) {
        perror("socket";
        exit(1);
    }
    my_addr.sin_family = AF_INET;         /* host byte order */
    my_addr.sin_port = htons(MYPORT );     /* short, network byte order */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
    bzero(&(my_addr.sin_zero), 8 );        /* zero the rest of the struct */
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
        perror("bind";
        exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen";
        exit(1);
    }
        sin_size = sizeof(struct sockaddr_in);
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
                perror("accept";
        }
        printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
        if (write(new_fd, "Hello, world!\n", 100) == -1) {
                perror("send";
        }
        while(1) {
                FD_ZERO( &readfsd );
                /* #01 Update Start */
                FD_SET( new_fd, &readfsd );
                printf("is reading....\n";
                if (select(new_fd+1, &readfsd, NULL, NULL, NULL))
                {
                        if ((numbytes=read(new_fd, buf, 100)) == -1) {
                                perror("recv";
                                printf("the recv is error";
                        } else {
                                buf[numbytes] = '\0';
                                printf("Received2: %s",buf);
                                if (write(new_fd, buf, 14, 0) == -1)
                                        perror("send";
                        }
                }
    }
}

clint.c:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 3490    /* the port client will be connecting to */
#define MAXDATASIZE 100 /* max number of bytes we can get at once */

int main(int argc, char *argv[]) {
    int sockfd, numbytes;  
    char buf[MAXDATASIZE];
    struct hostent *he;
    struct sockaddr_in their_addr; /* connector's address information */
    if (argc != 2) {
        fprintf(stderr,"usage: client hostname\n";
        exit(1);
    }
    if ((he=gethostbyname(argv[1])) == NULL) {  /* get the host info */
        herror("gethostbyname");
        exit(1);
    }
        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }
    their_addr.sin_family = AF_INET;      /* host byte order */
    their_addr.sin_port = htons(PORT); /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero), ;     /* zero the rest of the struct */
    if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {
        perror("connect");
        exit(1);
    }
    if ((numbytes=read(sockfd, buf, MAXDATASIZE)) == -1) {
        perror("recv");
        exit(1);
    } else {
        buf[numbytes] = '\0';
        printf("-Received: %s----------\n",buf);
                fflush(stdout);
    }
while(1) {
        printf("please input send message\n");
        scanf("%s", buf);
        if (write(sockfd, buf, sizeof(buf)) == -1) {
            perror("send");
        } else {
                printf("now is read...");
                if ((numbytes=read(sockfd, buf, MAXDATASIZE)) == -1) {
                        perror("recv");
                        exit(1);
                } else {
                        buf[numbytes] = '\0';
                        printf("Received: %s",buf);
                }
        }
}
    close(sockfd);
    return 0;
}
以上程序在AIX上做编写.请各牛人指点错误,非常感谢.

[ 本帖最后由 jist12321 于 2007-4-24 20:00 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-04-24 20:02 |只看该作者
问题解决了,以上的代码,已经是正确的了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP