// 服务器端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main(int argc,char *argv[])
{        int sockfd=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in serveraddr;
        serveraddr.sin_family=AF_INET;
        serveraddr.sin_port=htons(atoi(argv[1]));
        serveraddr.sin_addr.s_addr=INADDR_ANY;
        if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
                perror("bind error");
                exit(1);
        }
        printf("bind\n");
        if(listen(sockfd,10)<0){
                perror("listen error");
                exit(1);
        }
        struct sockaddr_in clientaddr;
        char buffer[512];
        socklen_t clientaddr_len = sizeof(clientaddr);
        printf("listen");
        while(1){
                int fd = accept(sockfd,(struct sockaddr*)&clientaddr,&clientaddr_len);
                printf("accept connect");
                if(fd<0){
                        perror("accept error");
                        continue;
                }
                printf("accept connect");
                pid_t pid=fork();
                if(pid <0){
                        continue;
                }else if(pid == 0){
                        // child process
                        while(1){
                                memset(buffer,0,sizeof(buffer));
                                read(sockfd,buffer,sizeof(buffer));
                                fputs(buffer,stdout);
                        }
                }else {
                        printf("parent process");
                }        }
//      close(fd);
        close(sockfd);
        return 0;
}// 客户端#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
int main(int argc,char *argv[])
{        int sockfd=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in serveraddr;
        serveraddr.sin_family=AF_INET;
        serveraddr.sin_port=htons(atoi(argv[1]));
        char ip[16];
        memset(ip,0,sizeof(ip));
        strcpy(ip,"127.0.0.1");
        inet_pton(AF_INET,ip,&serveraddr.sin_addr.s_addr,sizeof(serveraddr));
        char buffer[512];
        if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0){
                perror("connect error");
                exit(1);
        }
        printf("connect ok \n");
//      close(fd);
        while(1){
                int ret;
                if(( ret= write(sockfd,buffer,sizeof(buffer)))<0){
                        perror("write error");
                        continue;
                }
                read(sockfd,buffer,ret);
                fputs(buffer,stdout);
                memset(buffer,0,sizeof(buffer));
        }
        return 0;
}

解决方案 »

  1.   

    你要注意accept函数,它的第一个参数sockfd称为监听套接口,它的返回值fd才是已连接套接口,服务器中数据传输应该用fd而不是sockfd
      

  2.   

    确实是这个问题 检查了好多次 后来发现这有问题  
    还有一个点 在客户端已经连接上后 服务器端的在accept函数堵塞时 bind函数与listen下面的两条print语句并没有输出,只有在我传输数据时才会被打印一次 ,就很奇怪
      

  3.   

    print有缓冲区的,执行了也不一定在屏幕上能看见输出